10

Python (2 のみ?) は variable の値を調べて、クラス定義からオブジェクト__metaclass__を作成する方法を決定します。モジュールまたはパッケージ レベルで定義することができます。その場合、そのモジュール内の後続のすべてのクラス定義に適用されます。type__metaclass__

ただし、flufl.enumパッケージので次のことが発生しました__init__.py

__metaclass__ = type

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

4

2 に答える 2

13

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

宣言は、上記でリンクしたコードでは実際には使用されていません (__init__.pyファイルにクラス宣言はありません) が、使用される可能性があります。これは、Python 2 のコードを Python 3 のように動作させる (すべてのクラスが常に新しいスタイルである) ボイラープレートの一部として含まれていたのではないかと思います。

于 2013-09-01T02:32:19.263 に答える
0

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

__metaclass__Python スーパーパッケージのようなものは存在しないため、「スーパーパッケージ」宣言は効果がありません。

于 2013-09-01T02:16:45.530 に答える