我一直在尝试了解 Python 中的元类。我明白了主要思想,但我似乎无法激活该机制。据我所知,您可以在构造类 K 时通过__metaclass__在全局或类级别设置为 M 来指定 M 作为元类。为了测试这一点,我编写了以下程序:
__metaclass__
p = print class M(type): def __init__(*args): type.__init__(*args) print("The rain in Spain") p(1) class ClassMeta: __metaclass__ = M ClassMeta() p(2) __metaclass__ = M class GlobalMeta: pass GlobalMeta() 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 西班牙的雨 4
我不应该在看完 1 和 2 之后再看《西班牙的雨》吗?这是怎么回事?
Python 3(您正在使用)中,元类由类定义中的关键字参数指定:
class ClassMeta(metaclass=M): pass
指定__metaclass__类属性或全局变量是 Python 2.x 中的旧语法,不再受支持。另请参阅“Python 3 中的新增功能”和PEP 2115。