我可以让一个类在Python中继承一个“in-program”类吗?
到目前为止我所拥有的是什么:base = list(cls.__bases__)
base.insert(0, ClassToAdd )
base = tuple( base )
cls = type( cls.__name__, base, dict(cls.__dict__) )
答案 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