可能重复:
Python dynamic inheritance: How to choose base class upon instance creation?
我想让一个类根据 init 方法中的参数动态选择基类。
Class A():
#...
Class B():
#...
Class C():
def __init__(self, base_type):
if parent_type == 'A':
#TODO: make C derive A
else:
#TODO: make C derive B
A和B是派生相同基类的库类。
a similar question的答案似乎太难看了。
答案 0 :(得分:2)
我假设你的意思是base_type而不是父类型。但以下应该有效
Class C():
def __init__(self, base_type):
if base_type == 'A':
self.__class__=A
else:
self.__class__=B
有关此方法的更多详细信息,请访问:http://harkablog.com/dynamic-state-machines.html
答案 1 :(得分:2)
虽然您可以更改__init__
中的课程,但更适合在__new__
中执行此课程。前者用于初始化,后者用于构建:
class A(object): pass
class B(object): pass
class C(object):
def __new__(cls, base_type, *args, **kwargs):
return super(C, cls).__new__(base_type, *args, **kwargs)
assert isinstance( C(A), A )
assert isinstance( C(B), B )
使用__init__
,您将创建C的实例,然后修改其类型。使用__new__
,您永远不会创建C的实例,只需要创建所需的base_type
。
答案 2 :(得分:0)
我完全同意cyroxx,你应该给我们一些你的问题的背景。就目前而言,在创建类的实例以初始化其成员之后调用__init__
。改变遗产的时间太晚了。
一个简单的班级工厂是否适合您:
class MyA(ABMixin, A): pass
class MyB(ABMixin, B): pass
def factory(class_type):
if class_type == 'A':
return MyA()
else:
return MyB()
我建议在python中阅读有关动态类创建的this SO answer。