小能豆

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

py

我一直在尝试了解 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 之后再看《西班牙的雨》吗?这是怎么回事?


阅读 8

收藏
2024-11-13

共1个答案

小能豆

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

class ClassMeta(metaclass=M):
  pass

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

2024-11-13