如何在不覆盖类的情况下覆盖类中使用的函数

时间:2021-01-07 09:57:29

标签: python

以这个文件1为例:

def _foo_prn():
    print("file1::foo.prn")

class foo(object):
    def prn(self):
        _foo_prn()

我想以某种方式实例化 file2 中的 foo 但覆盖 _foo_prn 并获得此输出,例如:

def _foo_prn():
    print("This is my preferred output.")

myfoo = foo()
myfoo.prn()

# Output: This is my preferred output.

这可能吗? 或者我必须重写这个类?

注意:file1 在我用 pip 安装的包中。所以我无法对其进行修改。

2 个答案:

答案 0 :(得分:1)

您可以使用“monky patching”来保存前一个函数的状态。

import Foo
foo =Foo()
foo._foo_prn = _foo_prn
foo.prn() #this is call the overridden method

答案 1 :(得分:0)

你可以让 _foo_prn 成为一个类方法,然后在 myfoo 上进行monkeypatch:

class Foo:
    def prn(self):
        self._foo_prn()

    def _foo_prn(self):
        print("file1::foo.prn")


def _foo_prn():
    print("This is my preferred output.")


myfoo = Foo()
myfoo._foo_prn = _foo_prn
myfoo.prn()