1

可能重复:
Python 动态继承:如何在创建实例时选择基类?

我希望一个类根据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 是派生相同基类的库类。

类似问题的答案似乎太难看了。

4

3 回答 3

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.

于 2012-08-24T05:41:54.563 回答
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

于 2012-08-23T20:54:35.403 回答
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()

我建议阅读this SO answer about dynamic class creation in python。

于 2012-08-23T20:40:46.537 回答