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个参数。我已经更新了我的答案。谢谢