猴子修补具有层次继承的实例的方法

Monkey-patching a method of an instance with hierarchical inheritance

想象下面的例子:

class Parent():
    def foo():
        ...

def Child(Parent):
    def foo():
        ... # some stuff
        super().foo()
        ... # some stuff

obj1 = Parent()
obj2 = Child()

patched_foo():
    ...

我试图在实例中从父 class 猴子修补 foo 方法 (而不是 classes ).我目前正在做以下事情:

import types

def monkey_patch(x):
    if isinstance(x, Parent):
        x.foo = types.MethodType(patched_foo, x)

这适用于 obj1,但不适用于 obj2,因为 Parent 的 foo 方法被覆盖了。有没有办法从 Parent 获取访问权限并修补 foo?也许以某种方式使用 super()?

super() 正在从父 class 对象中检索方法,其中只有一个。您可以在 class 上修补该方法,但父 class 及其后代的所有实例都会感受到这种变化。您不能对单个实例进行修补。