看來,它可以動態改變Base.__bases__
如果Base.__base__
不object
。 (通過動態更改,我的意思是,所有從Base
繼承的預先存在的實例也會動態更改,否則請參閱Mykola Kharechko's solution)。
如果Base.__base__
是一些虛擬的類TopBase
,然後分配給Base.__bases__
似乎工作:
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'
你的基地不再屬於你嗎?答案會很難? – Borealid 2010-07-07 08:37:55
我認爲這是不可能的,因爲所有的類都是Python 3中的新類,如果'Base'同時具有'object'和'Extender'作爲基類,MRO就會變得模糊不清。改爲創建一個從「Base」和「Extender」繼承的新類。 'Extender'也可能是ABC。 – Philipp 2010-07-07 08:50:43