Python 如何在运行时更改方法的功能
想知道在程序运行时,是否可以改变一个方法的功能,比如说:
x = obj1 + obj2
return x+y
然后你想添加:
x = obj1 + obj2
x+= obj3
return x+y
5 个回答
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 )
在代码运行时进行修改是不对的。这样做是不正确的。
正确的做法是写一个更通用的算法。
5
其实什么都可以做到,你可以在运行时对栈进行操作,还可以插入字节码。可以看看一些像 byteplay
这样的东西。
但是为什么要这么做呢?
这种修改方式不太直观,也不容易理解。其实你一开始就可以把 x += obj3
直接写在那里,然后把 obj3
设置为 0
;当你需要这行代码做点什么的时候,再把 obj3
改成非零的值就好了……
21
在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
不过,你不想这样做,因为这样的话,维护或调试这个程序的人肯定会想要找你麻烦(而这个人很可能就是你自己)。
注意:对特殊的“魔法”方法进行每个实例的定制是行不通的(这是因为Python内部的优化)。解决办法是让这个特殊方法调用一个普通的方法,然后在那个普通的方法上进行每个实例的定制。想了解更多,可以查看为什么动态添加`__call__`方法到一个实例上不起作用?。