首页 > 解决方案 > Python,如何更改另一个类实例的方法

问题描述

我想为另一个类实例的方法添加一些小功能。下面列出了我尝试过的内容。使用相同的方法,可以完全改变方法。但我想保留原始方法的略微改动版本。那可能吗?

顺便说一句:这些类不能相互继承,因为我不一定知道 B 类是什么。

class A:
    def alter_fn(self, obj):
        def wrapper():
            func = getattr(obj, obj.fn_name)
            out = func()
            print('out = ', out)
            return out
        setattr(obj, obj.fn_name, wrapper)
        return

class B:
    def __init__(self) -> None:
        self.fn_name = 'fn'

    def fn(self):
        return 123


a=A()
b=B()

a.alter_fn(b)
b.fn()

由于显而易见的原因,这会引发递归深度错误,但我不知道如何避免这种情况。我也试过func = copy(getattr(obj, obj.fn_name))

更改方法 b.fn 后,我希望它返回值,未更改的函数将返回(此处为 123),但我也希望它对此输出执行其他操作,在此示例中打印它。

标签: pythonclass

解决方案


将 的赋值移到func的定义之上wrapper

...
def alter_fn(self, obj):
    func = getattr(obj, obj.fn_name)
    def wrapper():
        ...

这种方式getattr只调用一次,wrapper可以func作为闭包变量访问。


推荐阅读