我有一个plot
方法的类,如下所示:
class A:
def plot(self):
...
我写了一个像这样的扩展方法:
def plot(self):
...
self.plot()
A.plot = plot
但这会产生递归调用。如何在不更改方法名称的情况下解决此问题?
答案 0 :(得分:1)
保持其先前的值:
_plot = A.plot
def plot(self):
_plot(self)
A.plot = plot
答案 1 :(得分:0)
您可以在课堂上使用猴子补丁,也可以只使用一个实例。请参阅以下smaple代码,setattr(A, 'method_to_patch', new_method_on_class)
覆盖A类中定义的方法。因此,实例a和b中的method_to_override
已经过修补。 TypeMethod
只能修补实例。因此,只有实例a已被修补。
class A(object):
def __init__(self):
self.words = 'testing'
def method_to_patch(self):
print ('words: {}'.format(self.words))
def new_method_on_class(self):
print ('class: patched and words: {}'.format(self.words))
def new_method_on_instance(self):
print ('instance: patched and words: {}'.format(self.words))
a = A()
b = A()
a.method_to_patch()
setattr(A, 'method_to_patch', new_method_on_class)
a.method_to_patch()
b.method_to_patch()
a.method_to_patch = types.MethodType(new_method_on_instance, a)
a.method_to_patch()
b.method_to_patch()
输出:
字样:测试
class:patched and words:testing
class:patched and words:testing
实例:修补和单词:测试
class:patched and words:testing