4

クラスがありParentます。__new__forを定義して、インスタンス化時に何らかの魔法を実行するようにしたいと考えてParentいます (理由については、脚注を参照してください)。また、子クラスがこのクラスや他のクラスから継承して、親の機能を取得するようにしたいと考えています。は、子クラスのベースとクラスのサブクラスのインスタンスを返しParentます。__new__Parent

子クラスは次のように定義されます。

class Child(Parent, list):
    pass

__new__しかし、今では何を呼び出すべきかわかりませParent__new__。を呼び出すobject.__new__と、上記のChild例では を呼び出す必要があると不平を言いlist.__new__ます。しかし、どうやってそれをParent知ることができますか? すべての をループし、ブロック内で__bases__それぞれを呼び出すように機能させました。__new__try:

class Parent(object):
    def __new__(cls, *args, **kwargs):
        # There is a special wrapper function for instantiating instances of children
        # classes that passes in a 'bases' argument, which is the __bases__ of the
        # Children class.
        bases = kwargs.get('bases')
        if bases:
            cls = type('name', bases + (cls,), kwargs.get('attr', {}))
            for base in cls.__mro__:
                if base not in (cls, MyMainType):
                    try:
                        obj = base.__new__(cls)
                        break
                    except TypeError:
                        pass
            return obj
        return object.__new__(cls)

しかし、これはハックのように見えます。確かに、これを行うためのより良い方法があるはずですか?

ありがとう。

  • 私が使用したい理由は、クラスに割り当てられたいくつかの動的属性 (魔法の属性など)__new__を持つサブクラスのオブジェクトを返すことができるようにするためです。__int__これを行うこと__init__self.__class__もできましたが、新しいクラスの内部構造が異なる場合は変更できません__init__。ここでは、多重継承が原因です。
4

1 に答える 1

4

これにより、必要なものが得られると思います:

return super(Parent, cls).__new__(cls, *args, **kwargs)

basesキーワード引数は必要ありません。私があなたを誤解していて、あなたが意図的にそれをそこに入れているのでない限り.

于 2010-01-26T02:38:01.573 に答える