我一直在尝试了解 Python 中的元类。我明白了主要想法,但我似乎无法激活该机制。据我了解,您可以在构建类 K 时通过在全局或类级别将
__metaclass__
设置为 M 来指定 M 作为元类。为了测试这一点,我编写了以下程序:
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。
这在 Python 2.6(及更早版本)中按照您的预期工作,但在 3.0 中元类的指定方式有所不同:
class ArgMeta(metaclass=M): ...
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
如你所料。