__metaclass__はPythonでメタクラスの使用を強制するべきではありませんか?

StackOverflow https://stackoverflow.com/questions/818483

質問

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
Python 3.0.1

C:\Documents and Settings\Daniel Wong\Desktop>python meta.py
1
2
3
The rain in Spain
4

「スペインの雨」が表示されない1と2の後?ここで何が起こっているのですか?

役に立ちましたか?

解決

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

class ClassMeta(metaclass=M):
  pass

__ metaclass __ クラスプロパティまたはグローバル変数の指定は、Python 2.xからの古い構文であり、サポートされなくなりました。 &quot; Python 3の新機能&quot; および< a href = "http://www.python.org/dev/peps/pep-3115/" rel = "nofollow noreferrer"> PEP 2115 。

他のヒント

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

class ArgMeta(metaclass=M): ...

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

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

ご想像のとおり。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top