В этой статье есть фрагмент, показывающий использование __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'
Небольшое изучение этого вопроса в Google указывает на некоторую несовместимость между классами нового и старого стилей в отношении изменения иерархии наследования во время выполнения. В частности: «Объекты классов нового стиля не поддерживают присвоение их атрибуту
bases».
Мой вопрос: возможно ли заставить приведенный выше пример Friendly/Person работать с использованием классов нового стиля в Python 2.7+, возможно, с помощью атрибута __mro__?
Отказ от ответственности: я полностью осознаю, что это непонятный код. Я полностью осознаю, что в реальном рабочем коде подобные трюки обычно граничат с нечитабельностью, это всего лишь мысленный эксперимент, и для любителей узнать что-нибудь о том, как Python решает проблемы, связанные с множественным наследованием.
Подробнее здесь:
https://stackoverflow.com/questions/953 ... at-runtime