在python中动态派生一个类

时间:2012-08-23 20:12:16

标签: python inheritance

  

可能重复:
  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的答案似乎太难看了。

3 个答案:

答案 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