代码之家  ›  专栏  ›  技术社区  ›  Timmy

在python中以编程方式向类添加继承?

  •  3
  • Timmy  · 技术社区  · 16 年前

    到目前为止,我得到的是:

    base = list(cls.__bases__)
    base.insert(0, ClassToAdd )
    base = tuple( base )
    cls = type( cls.__name__, base, dict(cls.__dict__) )
    
    3 回复  |  直到 16 年前
        1
  •  8
  •   sneeu    5 年前

    下面是一个例子,使用Greg Hewgill的建议:

    class Foo(object):
        def beep(self):
            print('Hi')
    
    class Bar(object):
        x = 1  
    
    bar = Bar()
    bar.beep()
    # AttributeError: 'Bar' object has no attribute 'beep'
    
    Bar = type('Bar', (Foo,object), Bar.__dict__.copy())
    bar.__class__ = Bar
    bar.beep()
    # 'Hi'
    
        2
  •  4
  •   Greg Hewgill    16 年前

    是的,那个 type()

    类型 名称 , 基地 口述

    class 声明。这个 名称 __name__ 属性;这个 基地 tuple逐项列出基类并成为 __bases__ 属性;以及 口述 dictionary是包含类主体定义的名称空间,并成为 __dict__ 属性。

        3
  •  1
  •   brent.payne    14 年前

    另一种选择不是动态地更改类层次结构,而是用新功能装饰对象的实例。这通常更干净,更易于调试,因为您只需更改代码位于控件中的对象,而不必对整个类层次结构进行横切更改。

    def extend_object(obj):
        class ExtensionClass(obj.__class__):
            def new_functionality(self):
                 print "here"
        obj.__class__ = ExtensionClass
    
    b = Foo()
    extend_object(b)
    b.new_functionality()
    #prints "here"
    
        4
  •  1
  •   Jura Brazdil    6 年前

    我的解决方案考虑了父类和子类的基类。

    import inspect    
    
    def inherit_from(Child, Parent):
    
        # Prepare bases
        child_bases = inspect.getmro(Child)
        parent_bases = inspect.getmro(Parent)
        bases = tuple([item for item in parent_bases if item not in child_bases]) + child_bases
    
        # Construct the new return type
        Child = type(Child.__name__, bases, Child.__dict__.copy())
    
        return Child