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()

Pythonでの動的クラスの作成に関するこのSOの回答を読むことをお勧めします。

于 2012-08-23T20:40:46.537 に答える