2

この回答から「メタクラスとは何ですか?」私はこれを得た:

最初にクラス Foo(object) を記述しますが、クラス オブジェクト Foo はまだメモリ内に作成されていません。

Python は、クラス定義でメタクラスを探します。見つかった場合は、それを使用してオブジェクト クラス Foo を作成します。そうでない場合は、型を使用してクラスを作成します。

テストしたところ、クラスのコンストラクターが実行される前に、クラスの属性がインスタンス化されるようです。私は何を誤解していますか?

テストコード:

class meta(type):

    def __init__(cls, name, bases, dic):
        type.__init__(cls, name, bases, dic)

        print hasattr(cls, "a")
        cls.a = "1"


class A(object):
    a = "a"
    __metaclass__ = meta


class B(object):
    __metaclass__ = meta


class C(object):
    __metaclass__ = meta
    a = "a"


print A.a
print B.a
print C.a

出力:

True
False
True
1
1
1
4

1 に答える 1

4

はい、クラスが構築される前にクラス本体が実行されます。

クラスの本体は一時的な名前空間を提供し、その名前空間内のすべてのローカル名は、基底クラスとクラスの名前と共に、クラス オブジェクトを構築するための辞書として与えられます。

type()コンストラクターでもこれを行うことができます:

>>> Foo = type('Foo', (), {'a': 1})
>>> Foo.a
1

クラス本体は基本的に関数として実行され、その関数のローカル名前空間を使用してクラス属性 (type()上記の 3 番目の引数) を作成します。

Python 3では、メタクラスの__prepare__フックを使用して、そのプロセスにもう少し影響を与えます。__prepare__クラス本体の初期名前空間を返すクラス メソッドである必要があります。クラス本体が実行される前に、生成されたクラス本体に追加の名前を挿入するために使用します。

class MyMeta(type):
   @classmethod
   def __prepare__(mcl, name, bases):
       return {'a': 1}
于 2013-01-24T15:43:39.860 に答える