2010-12-10 2 views
4

интересно, если его можно изменить functionalify метода во время выполнения, напримерпитон, как изменить функциональность метода во время выполнения

x = obj1 + obj2 
return x+y 

и вы хотите добавить

x = obj1 + obj2 
x+= obj3 
return x+y 
+0

http://mywiki.wooledge.org/XyProblem – 2010-12-10 10:32:44

+1

Что такое `y`? Что такое `Y`? Что вы подразумеваете под `return x = Y`? – 2010-12-10 10:34:22

+0

return x = y, whatrever x и y are, это недопустимое выражение в Python – Ant 2010-12-10 10:35:34

ответ

2

Все возможно, вы можете выполнять манипулирование стеками и вставлять байт-код во время выполнения. См. Такие вещи, как byteplay.

Но почему?

Такая модификация неинтуитивная и нечитабельная, лучше, если вы оставите x += obj3 там на первом месте и установите obj3 в 0; Когда вам нужна эта строка, чтобы сделать что-то, вы используете ненулевое значение на obj3 ...

1

Изменение функциональности метода во время выполнения - это то, что программы делают все время. Это называется «обобщением».

Все, что вы делаете, это написать более общий алгоритм. Это не сложно.

def run_time_change(y, *object_list): 
    x=sum(object_list) 
    return x+y 

example1 = run_time_change(y, obj1, obj2) 
example2 = run_time_change(y, obj1, obj2, obj3) 

Нет места для изменения кода «времени выполнения». Это неверно.

Правильная вещь - написать более общий алгоритм.

8

В классах python только объекты, которые могут быть изменены во время выполнения. Так, например:

class Dog: 
    def talk(self): 
     print "bark" 
dog1 = Dog() 
dog1.talk() # --> Bark 

def cat_talk(self): 
    print "Meow" 

Dog.talk = cat_talk 
dog1.talk() # --> Meow 

но вы не хотите делать такие вещи, или тот, кто должен будет поддерживать или отлаживать эту программу наверняка попытается убить вас (и этот парень будет, вероятно, сами)

0

Непонятно, что вы хотите сделать, но changing methods and classes at runtime is called "Monkey Patching", и в Python (как следует из названия) нахмурился.

Причина в том, что он делает ваш код чрезвычайно трудным для отладки, так как легко понять, просто прочитав код, версия которого вызывается. Или, что более вероятно, человек, выполняющий отладку, даже не поймет, что метод был изменен, и поэтому может иметь смысл при любом поведении, которое они видят.

Итак, пока вы можете динамически изменять методы, лучше всего, если вы этого не сделаете. Если вы дадите более подробную информацию о проблеме, которую пытаетесь решить, кто-то сможет предложить более «Pythonic» решение.

Смежные вопросы