【发布时间】:2020-07-01 09:59:22
【问题描述】:
我想用 B 类中的方法覆盖 A 类实例的方法,但以某种方式对实例的旧方法的所有引用(在覆盖方法之前进行)然后“链接”到新的一个。在代码中:
import types
class A:
def foo(self):
print('A')
class B:
def foo(self):
print('B')
class C:
def __init__(self, a):
self.func = a.foo
def do_something(self):
self.func()
a = A()
c = C(a)
method_name = 'foo' # it has to be dynamic
new_method = getattr(B, method_name)
setattr(a, method_name, types.MethodType(new_method, a))
c.do_something() # still prints A, I want it to print B now
我希望 c.func 在设置 a 的属性后保留类 B 的新方法(不对 c 对象做任何事情)。
有没有办法设置实例 a 的属性,以便所有之前进行的引用都引用新方法?
对不起,如果这个问题有点愚蠢,我不太喜欢这个。
【问题讨论】:
-
请注意,要使其工作,
c必须知道a,而不仅仅是a.foo。这是您的设置可接受的更改吗? -
并非总是如此。但在某些情况下,它可能会有所帮助。这取决于实现。