如何在Python中以编程方式为类添加继承?
我可以在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'