6

Python のメタクラスについて学習しようとしています。主なアイデアはわかりましたが、メカニズムを起動できないようです。__metaclass__私が理解しているように、グローバルまたはクラスレベルで M に設定することにより、クラス K を構築するときに M をメタクラスとして指定できます。これをテストするために、次のプログラムを作成しました。

p = print

class M(type):
    def __init__(*args):
        type.__init__(*args)
        print("The rain in Spain")

p(1)
class ClassMeta:
    __metaclass__ = M

p(2)
__metaclass__ = M
class GlobalMeta: pass

p(3)
M('NotMeta2', (), {})

p(4)

ただし、実行すると、次の出力が得られます。

C:\Documents and Settings\Daniel Wong\Desktop>python --version
パイソン 3.0.1

C:\Documents and Settings\Daniel Wong\Desktop>python meta.py
1
2
3
スペインの雨
4

1と2の後に「スペインの雨」を見るべきではないですか?何が起きてる?

4

3 に答える 3

14

Python 3 (使用している) では、メタクラスはクラス定義のキーワード パラメータによって指定されます。

class ClassMeta(metaclass=M):
  pass

クラス プロパティまたはグローバル変数の指定は__metaclass__、Python 2.x の古い構文であり、サポートされなくなりました。「Python 3 の新機能」PEP 2115も参照してください。

于 2009-05-04T01:29:25.473 に答える
2

これは Python 2.6 (およびそれ以前) では期待どおりに機能しますが、3.0 ではメタクラスの指定が異なります。

class ArgMeta(metaclass=M): ...
于 2009-05-04T01:33:34.730 に答える
2

メタクラスの構文はPython 3.0 で変更されました。この__metaclass__属性は、クラス レベルでもモジュール レベルでも特別なものではなくなりました。しようとしていることを実行するには、ステートメントmetaclassのキーワード引数として指定する必要があります。class

p = print

class M(type):
    def __init__(*args):
        type.__init__(*args)
        print("The rain in Spain")

p(1)
class ClassMeta(metaclass=M): pass

収量:

1
The rain in Spain

ご想像のとおり。

于 2009-05-04T01:37:32.753 に答える