This article имеет фрагмент, показывающий использование __bases__
для динамического изменения иерархии наследования некоторого кода Python путем добавления класса к существующей коллекции классов классов, из которых он наследует. Хорошо, что трудно читать, код, вероятно, понятнее:Как динамически менять базовый класс экземпляров во время выполнения?
class Friendly:
def hello(self):
print 'Hello'
class Person: pass
p = Person()
Person.__bases__ = (Friendly,)
p.hello() # prints "Hello"
То есть, Person
не наследует Friendly
на уровне исходного кода, а это наследование отношение добавляется динамически во время выполнения модификации атрибута __bases__
класса Person. Однако, если вы измените Friendly
и Person
быть новыми классами стилей (путем наследования от объекта), вы получите следующее сообщение об ошибке:
TypeError: __bases__ assignment: 'Friendly' deallocator differs from 'object'
Немного погуглить на это, кажется, indicate some incompatibilities между новым стилем и старыми классами стилей в отношении изменения иерархии наследования во время выполнения. В частности: "New-style class objects don't support assignment to their bases attribute".
Мой вопрос: можно ли использовать приведенный выше пример Friendly/Person, используя классы нового стиля в Python 2.7+, возможно, используя атрибут __mro__
?
Отказ от ответственности: Я полностью понимаю, что это неясный код. Я полностью понимаю, что в реальных производственных трюках такие трюки, как правило, граничат с нечитаемыми, это просто мысленный эксперимент, и для funzies узнать что-то о том, как Python занимается проблемами, связанными с множественным наследованием.
Это также хорошо для учащихся, чтобы прочитать это, если они не знакомы с метаклассом, type(), ...: http://www.slideshare.net/gwiener/metaclasses-in-python :) – loolooyyyy
Вот мое использование дело. Я импортирую библиотеку, у которой класс B наследуется от класса A. – FutureNerd
Вот мой фактический прецедент. Я импортирую библиотеку, у которой класс B наследуется от класса A. Я хочу создать наследование new_A из A с помощью new_A_method(). Теперь я хочу создать наследование new_B из ... ну, из B, как если бы B унаследовал от New_A, так что методы B, методы A и new_A_method() все доступны экземплярам New_B. Как я могу сделать это без обезглавливания существующего класса A? – FutureNerd