首页 文章

__bases__下次没有't work! What'?

提问于
浏览
8

以下代码在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中动态地(在运行时)将超类添加到类中?

但我已经准备好答案会很难! )

2 回答

  • 4

    至于我,这是不可能的 . 但是您可以动态创建新类:

    class Extender(object):
        def extension(self):
            print("Some work...")
    
    class Base(object):
        pass
    
    Base = type('Base', (Base, Extender, object), {})
    Base().extension()
    
  • 5

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

相关问题