Python 如何在运行时更改方法的功能

10 投票
5 回答
21471 浏览
提问于 2025-04-16 08:20

想知道在程序运行时,是否可以改变一个方法的功能,比如说:

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__`方法到一个实例上不起作用?

撰写回答