__基地不起作用!下一步是什么?

2024-05-13 23:57:42 发布

您现在位置:Python中文网/ 问答频道 /正文

以下代码在Python 3.x中不起作用,但它以前用于旧样式的类:

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

class Base:
    pass

Base.__bases__ += (Extender,)

Base().extension()

问题很简单:如何在Python3.x中将超级类动态地(在运行时)添加到类中?

但我准备好了答案很难回答!)在


Tags: 代码selfbasedefextension样式somepass
2条回答

似乎可以动态更改Base.__bases__ 如果Base.__base__不是{}。(动态更改,我的意思是,所有从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...

这在Python2(用于新样式类和旧样式类)和Python3中进行了测试。我不知道为什么它能起作用,而这个却不能:

^{pr2}$

对我来说这是不可能的。但您可以动态创建新类:

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

class Base(object):
    pass

Base = type('Base', (Base, Extender, object), {})
Base().extension()

相关问题 更多 >