Как динамически изменять базовый класс экземпляров во время выполнения?Python

Программы на Python
Anonymous
 Как динамически изменять базовый класс экземпляров во время выполнения?

Сообщение Anonymous »

В этой статье есть фрагмент, показывающий использование __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

Вернуться в «Python»