在python中动态派生类

2024-09-30 06:30:31 发布

您现在位置:Python中文网/ 问答频道 /正文

Possible Duplicate:
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的回答似乎太难看了。在


Tags: tobasemakeinittypeinheritancedynamic基类
3条回答

虽然您可以在__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。在

我完全同意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。在

我想你指的是基类型而不是父类型。但下面的方法应该行得通

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

相关问题 更多 >

    热门问题