__bases__不起作用!接下来该怎么办?

11 投票
2 回答
5166 浏览
提问于 2025-04-16 00:55

下面的代码在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'

撰写回答