__metaclass__不应该强制在Python中使用元类吗?

all*_*ode 6 python oop metaclass python-3.x

我一直在努力学习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)
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,我得到以下输出:

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之后看到"西班牙的雨"吗?这里发生了什么?

sth*_*sth 13

在Python 3(您正在使用)中,元类由类定义中的关键字参数指定:

class ClassMeta(metaclass=M):
  pass
Run Code Online (Sandbox Code Playgroud)

指定__metaclass__类属性或全局变量是Python 2.x中的旧语法,不再受支持.另请参阅"Python 3中的新功能"PEP 2115.