以下代码在Python 3.x中不起作用,但它曾用于旧式类:
class Extender: def extension(self): print("Some work...") class Base: pass Base.__bases__ += (Extender,) Base().extension()
Question is simple: 如何在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__ 不是 object ,似乎可以动态更改 Base.__bases__ . (通过动态更改,我的意思是所有从 Base 继承的预先存在的实例也会动态更改 . 否则请参阅Mykola Kharechko's solution) .
Base.__base__
object
Base.__bases__
Base
如果 Base.__base__ 是一个虚拟类 TopBase ,则分配给 Base.__bases__ 似乎有效:
TopBase
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'
2 回答
至于我,这是不可能的 . 但是您可以动态创建新类:
如果
Base.__base__
不是object
,似乎可以动态更改Base.__bases__
. (通过动态更改,我的意思是所有从Base
继承的预先存在的实例也会动态更改 . 否则请参阅Mykola Kharechko's solution) .如果
Base.__base__
是一个虚拟类TopBase
,则分配给Base.__bases__
似乎有效:这被测试在Python 2(用于新旧类)和Python 3中工作 . 我不知道为什么它可以工作,而这不是: