__bases__不起作用!接下来该怎么办?
下面的代码在Python 3.x中无法运行,但在旧版本的类中是可以的:
class Extender:
def extension(self):
print("Some work...")
class Base:
pass
Base.__bases__ += (Extender,)
Base().extension()
问题很简单: 我怎么才能在Python 3.x中动态地(在运行时)给一个类添加父类呢?
不过我准备好接受这个答案会很复杂!)
2 个回答
6
对我来说,这是不可能的。不过你可以动态地创建一个新的类:
class Extender(object):
def extension(self):
print("Some work...")
class Base(object):
pass
Base = type('Base', (Base, Extender, object), {})
Base().extension()
7
看起来,如果 Base.__base__
不是 object
,我们是可以动态地改变 Base.__bases__
的。这里的“动态改变”是指,所有已经存在的从 Base
继承的实例也会被一起改变。如果不是这样的话,可以参考 Mykola Kharechko 的解决方案。
如果 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'