__ основания __ не работают! Что является следующим?

Следующий код не работает в Python 3.x, но он раньше работал с классами старого стиля:

class Extender:
    def extension(self):
        print("Some work...")

class Base:
    pass

Base.__bases__ += (Extender,)

Base().extension()

Вопрос прост: Как я могу добавить динамично (во времени выполнения) суперкласс к классу в Python 3.x?

Но я готов, ответ будет тверд!)

9
задан SilentGhost 7 July 2010 в 08:47
поделиться

2 ответа

Как по мне, это невозможно. Но вы можете создать новый класс динамически:

class Extender(object):
    def extension(self):
        print("Some work...")

class Base(object):
    pass

Base = type('Base', (Base, Extender, object), {})
Base().extension()
5
ответ дан 4 December 2019 в 21:07
поделиться

Похоже, что можно динамически изменять 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'
5
ответ дан 4 December 2019 в 21:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: