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

时间:2010-05-06 19:49:48

标签: python

我可以让一个类在Python中继承一个“in-program”类吗?

到目前为止我所拥有的是什么:

base = list(cls.__bases__)
base.insert(0, ClassToAdd )
base = tuple( base )
cls = type( cls.__name__, base, dict(cls.__dict__) )

4 个答案:

答案 0 :(得分:9)

以下是一个例子,使用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

答案 1 :(得分:4)

是的,type()内置函数有三个参数形式可以做到这一点:

  

输入名称基地 dict

     

返回一个新类型对象。这基本上是class语句的动态形式。 name 字符串是类名,并成为__name__属性; bases 元组逐项列出基类并成为__bases__属性; dict 字典是包含类体定义的命名空间,并成为__dict__属性。

答案 2 :(得分:1)

另一个选择是不动态更改类层次结构,而是使用新功能装饰对象实例。这通常更简洁,更容易调试,因为您只需更改代码所在的对象,而无需对整个类层次结构进行交叉更改。

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"

答案 3 :(得分:0)

这是我的解决方案,它确实考虑了父类和子类的基类。

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