Обезьяна-исправление метода экземпляра с иерархическим наследованием

#python #monkeypatching

#python #обезьянье исправление

Вопрос:

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

 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 перезаписан. Есть ли способ получить доступ и исправить foo от Parent? Возможно, каким-то образом используя super() ?

Ответ №1:

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

Комментарии:

1. Итак, в итоге я могу исправить прямые методы отдельного экземпляра, но не методы в его родителях.