如何在Python中以编程方式为类添加继承?

6 投票
4 回答
3319 浏览
提问于 2025-04-15 22:26

我可以在Python中让一个类“动态”继承另一个类吗?

这是我目前的代码:

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

4 个回答

2

另一种选择是,不动态改变类的层次结构,而是给对象的实例添加新的功能。这种做法通常更简洁,也更容易调试,因为你只需要改变你代码控制的对象,而不需要对整个类的结构进行大范围的修改。

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"
5

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

type(名称, 基类, 字典)

这个函数会返回一个新的类型对象。可以把它理解为一种动态创建类的方式。名称这个字符串就是类的名字,它会变成这个类的__name__属性;基类这个元组列出了所有的父类,它会变成__bases__属性;而字典这个字典则包含了类的定义内容,它会变成__dict__属性。

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'

撰写回答