Обезьяно-патчирование метода экземпляра с иерархическим наследованием - PullRequest
0 голосов
/ 24 апреля 2019

Представьте пример ниже:

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

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

obj1 = Parent()
obj2 = Child()

patched_foo():
    ...

Я пытаюсь обезопасить foo метод из родительского класса в случаях (а не в классах). Я сейчас делаю ниже:

import types

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

Это прекрасно работает с obj1, но не для obj2, где метод foo для Parent перезаписывается. Есть ли способ получить доступ и исправить патч от Parent? Возможно, как-то используя super()?

1 Ответ

1 голос
/ 24 апреля 2019

super() извлекает метод из объекта родительского класса, из которых только один. Вы можете пропатчить метод в этом классе, но изменение будет ощущаться всеми экземплярами родительского класса и его потомками. Вы не можете исправлять отдельные экземпляры.

...