2013-09-01 8 views
6

Python(2のみ?)は、変数__metaclass__の値を調べて、クラス定義からtypeオブジェクトを作成する方法を決定します。 It is possible to define __metaclass__ at the module or package levelであり、その場合、そのモジュール内のすべての後続のクラス定義に適用されます。`__metaclass__ = type`の目的は何ですか?

しかし、私が遭遇した中で、次のflufl.enumパッケージの__init__.py

__metaclass__ = type 

定義されていない__metaclass__場合、デフォルトのメタクラスがtypeあるので、これは効果がないではないでしょうか? (__metaclass__がより高いスコープで割り当てられている場合、この割り当てはデフォルトに戻りますが、割り当てはありません)。その目的は何ですか?

答えて

9

Python 2では、宣言である__metaclass__ = typeは、そうでなければ古いスタイルのクラスを作成し、新しいスタイルのクラスを作成する宣言を行います。古いスタイルのクラスだけがモジュールレベル__metaclass__宣言を使用します。新しいスタイルのクラスは、__metaclass__がクラス変数として提供されていない限り、その基底クラス(例えば、object)からメタクラスを継承します。

上記のリンクされたコードで宣言が実際には使用されていません(__init__.pyファイルにクラス宣言はありません)。私はそれがPython 2のコードをPython 3(すべてのクラスは常に新しいスタイル)のように動作させるいくつかの定型文の一部として含まれていると思われます。

0

はい、効果はありません。おそらくflufl.enumの作者からの誤解、または前のコードからの残されたものです。

"スーパーパッケージ" __metaclass__宣言は、Pythonスーパーパッケージのようなものがないので、何の効果もありません。

関連する問題