其他分享
首页 > 其他分享> > 扩展类实例

扩展类实例

作者:互联网

MyClass在module.py中定义.我们无法对其进行修改.但是我们知道类定义看起来像这样:

class MyClass:
    def method(self, msg):
        print 'from method:', msg

我通过导入模块开始我的脚本,然后声明一个对象的实例:

import module    
foo = module.MyClass()

然后,我编写自己的函数:

def function(msg):
    print 'from function:', msg

现在,每次使用foo.method(”)时,我都想调用function(),因此它也输出相同的消息.

这种情况会被称为猴子修补吗?如何实现所需要的?

解决方法:

是的,这叫做猴子修补.

这基本上是修饰,但是在定义了类之后手动完成.

from functools import wraps

def wrapper(f):
    @wraps(f)
    def wrapped(*args, **kwargs):
        myFunction()
        return f(*args, **kwargs)
    return wrapped

MyClass.printThis = wrapper(MyClass.printThis)

这将影响MyClass的所有实例,甚至包括应用补丁之前创建的实例.

如果您不需要动态修改运行时行为,请避免使用猴子补丁,而是喜欢使用继承自定义行为,如注释中所建议.它不那么hacky.

标签:monkeypatching,python
来源: https://codeday.me/bug/20191026/1935451.html