Следующий код не работает в Python 3.x, но он раньше работал с классами старого стиля:
class Extender:
def extension(self):
print("Some work...")
class Base:
pass
Base.__bases__ += (Extender,)
Base().extension()
Вопрос прост: Как я могу добавить динамично (во времени выполнения) суперкласс к классу в Python 3.x?
Но я готов, ответ будет тверд!)
Как по мне, это невозможно. Но вы можете создать новый класс динамически:
class Extender(object):
def extension(self):
print("Some work...")
class Base(object):
pass
Base = type('Base', (Base, Extender, object), {})
Base().extension()
Похоже, что можно динамически изменять Base .__ base __
если Base .__ base __
не является объектом
. (Под динамическим изменением я подразумеваю таким образом, что все ранее существовавшие экземпляры, которые наследуются от Base
, также динамически изменяются. В противном случае см. решение Николая Харечко ).
Если Base .__ base __
- это какой-то фиктивный класс TopBase
, то присваивание Base .__ base __
, похоже, работает:
class Extender(object):
def extension(self):
print("Some work...")
class TopBase(object):
pass
class Base(TopBase):
pass
b=Base()
print(Base.__bases__)
# (<class '__main__.TopBase'>,)
Base.__bases__ += (Extender,)
print(Base.__bases__)
# (<class '__main__.TopBase'>, <class '__main__.Extender'>)
Base().extension()
# Some work...
b.extension()
# Some work...
Base.__bases__ = (Extender, TopBase)
print(Base.__bases__)
# (<class '__main__.Extender'>, <class '__main__.TopBase'>)
Base().extension()
# Some work...
b.extension()
# Some work...
Это было протестировано для работы в Python 2 (для классов нового и старого стиля) и для Python 3. Я понятия не имею, почему это работает, а это не работает:
class Extender(object):
def extension(self):
print("Some work...")
class Base(object):
pass
Base.__bases__ = (Extender, object)
# TypeError: __bases__ assignment: 'Extender' deallocator differs from 'object'