__metaclass__はPythonでメタクラスの使用を強制するべきではありませんか?
-
03-07-2019 - |
質問
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
ご想像のとおり。
所属していません StackOverflow