Python 如何调用已被扩展方法重写的方法?
我有一个带有Python 如何调用已被扩展方法重写的方法?,python,Python,我有一个带有plot方法的类,如下所示: class A: def plot(self): ... def plot(self): ... self.plot() A.plot = plot 我写了一个扩展方法如下: class A: def plot(self): ... def plot(self): ... self.plot() A.plot = plot 但这将产生一个递归调用。如何在不更改方法
plot
方法的类,如下所示:
class A:
def plot(self):
...
def plot(self):
...
self.plot()
A.plot = plot
我写了一个扩展方法如下:
class A:
def plot(self):
...
def plot(self):
...
self.plot()
A.plot = plot
但这将产生一个递归调用。如何在不更改方法名称的情况下解决此问题?保留其以前的值:
_plot = A.plot
def plot(self):
_plot(self)
A.plot = plot
保留其以前的值:
_plot = A.plot
def plot(self):
_plot(self)
A.plot = plot
您可以在类上使用monkey patch,也可以只在一个实例上使用monkey patch。请参阅下面的示例代码,
setattr(A,'method_to_patch',new_method_on_class)
重写类A中定义的方法。因此,实例A和实例b中的method_to_override
都已被修补<代码>类型方法只能修补实例。因此,只有实例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()
输出:
关键词:测试
类别:补丁和文字:测试
类别:补丁和文字:测试
实例:补丁和文字:测试
类别:补丁和文字:测试
您可以在类上使用monkey patch,也可以只在一个实例上使用monkey patch。请参阅下面的示例代码,
setattr(A,'method_to_patch',new_method_on_class)
重写类A中定义的方法。因此,实例A和实例b中的method_to_override
都已被修补<代码>类型方法只能修补实例。因此,只有实例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()
输出:
关键词:测试
类别:补丁和文字:测试
类别:补丁和文字:测试
实例:补丁和文字:测试
类别:补丁和文字:测试
谢谢我已经从你的答案中学会了如何将方法扩展到实例。但我发现
a.method\u to\u patch=types.MethodType(实例上的新方法,a,a)
必须更改为a.method\u to\u patch=types.MethodType(实例上的新方法)
你是正确的<代码>方法类型在Python3中只接受2个参数。我已经更新了我的答案。谢谢,谢谢!我已经从你的答案中学会了如何将方法扩展到实例。但我发现a.method\u to\u patch=types.MethodType(实例上的新方法,a,a)
必须更改为a.method\u to\u patch=types.MethodType(实例上的新方法)
你是正确的<代码>方法类型在Python3中只接受2个参数。我已经更新了我的答案。谢谢