1

Python2.7でメタクラスを使って遊んでいます。そこで、次のようなコードを作成しました。

class M(type):
    def __new__(meta, name, parents, attrs):
        print 'In meta new'
        return super(meta, meta).__new__(meta, name, parents, attrs)

    def __init__(cls, *args, **kwargs):
        print 'In meta init'

    def __call__(cls, *attr, **val):
        print 'In meta call'
        return super(cls, cls).__new__(cls)

class A(object):
    __metaclass__ = M

    def __new__(cls):
        print 'In class new'
        return super(cls, cls).__new__(cls)

    def __init__(self):
        print 'In object init'

    def __call__(self):
        print 'In object call'

しかし、出力は私を混乱させます:

A()

In meta new
In meta init
In meta call

どういうわけか、クラスメソッド__new__と__init__がオーバーライドされたので、インタプリタはそれらをスキップします。誰かがこのことを説明できますか?

ご協力いただきありがとうございます。

4

2 に答える 2

1

あなたはsuper()間違って電話をかけています。の最初の引数は、クラスのインスタンスではなく、クラス自体super()であると想定されています。

return super(meta, meta).__new__(meta, name, parents, attrs)

する必要があります...

return super(M, meta).__new__(meta, name, parents, attrs)

他のsuper()呼び出しについても同様です。最初の引数は、それらが含まれるクラスでなければなりません。2 番目は実際のインスタンスです。

于 2012-10-26T07:26:08.647 に答える
0

元の Python メカニズムを使用していないため、機能しません。これは、およびメソッドcls()の自動動作を保証し、同じことを行わないメタクラス メソッドによってオーバーライドされます。__new____init____call__

于 2012-11-15T12:54:52.487 に答える