-1

可変量のいわゆる mixin クラスから新しいクラスを作成する関数を作成したいと考えています。私の最初の本能は使用すること*argsです...

>>> def mixins(*args):
        class Foo(*args):

SyntaxError: invalid syntax

...しかし、あまりうまくいきませんでした...うまくいかなかったので、これを試してみましたが、うまくいくようです:

>>> def mixins(*args):
        class Foo(args[0]):
            pass
        for arg in args[1:]:
            class Foo(Foo, arg):
                pass
        return Foo

質問

この問題を解決するための他のアプローチはありますか?

動機

多くの抽象メソッドを持つ抽象基本クラスを作成しました。いくつかのタイプのサブクラスがあり、それぞれが必要な抽象メソッドの一部を実装していますが、すべてではありません。2 つのサブクラスを混在させて作業インスタンスを作成できる場合もあれば、すべての抽象メソッドを実装するのに時間がかかる場合もあります。

4

2 に答える 2

2

type関数を使用してこれを行うことができます。

def mixins(*args):
    return type('Foo', args, {})

クラスが常に から継承されるようにすることもできますobject

def mixins(*args):
    bases = args if object in args else args + (object,)
    return type('Foo', bases, {})
于 2013-03-12T06:15:05.853 に答える
1

はい。なぜだめですか?

クラスオブジェクトをオンザフライで作成する方法は次のとおりです。

type('a',(object,),{})

これにより、オブジェクト基本クラスから派生し、属性が空の辞書であるタイプ - タイプ のクラス オブジェクトが作成されます。

したがって、あなたの場合、呼び出しは次のようになります。

type('Foo',args,{})

ここで、args には、Foo を継承するすべての基本クラスが含まれます。結果は、ミックスインから返すために使用できるクラスオブジェクトになります。

于 2013-03-12T06:13:54.040 に答える