После прочтения ответов на вопрос о классах исправлений обезьян в Python Я попытался применить рекомендованное решение к следующему случаю.
Представьте, что у нас есть модуль a.py
class A(object):
def foo(self):
print(1)
class AA(A):
pass
, и давайте попробуем сделать это следующим образом. Это работает, когда мы используем класс патчей обезьяны A
:
>>> import a
>>> class B(object):
... def foo(self):
... print(3)
...
>>> a.A = B
>>> x = a.A()
>>> x.foo()
3
Но если мы попробуем унаследованный класс, он не будет исправлен:
>>> y = a.AA()
>>> y.foo()
1
Есть ли способ обезьяны исправить класс со всеми его унаследованными классами?
РЕДАКТИРОВАТЬ
На данный момент лучшее решение для меня выглядит следующим образом:
>>> class AB(B, a.AA):
... pass
...
>>> a.AA = AB
>>> x = a.AA()
>>> x.foo()
3
Любой сложная структура a.AA
будет унаследована, и единственным отличием между AB
и a.AA
будет метод foo()
. Таким образом, мы не изменяем никакие внутренние атрибуты класса (например, __base__
или __dict__
). Единственный оставшийся недостаток - это то, что нам нужно сделать это для каждого из унаследованных классов.
Это лучший способ сделать это?