Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不应该';t_u元类_;在Python中强制使用元类?_Python_Oop_Python 3.x_Metaclass - Fatal编程技术网

不应该';t_u元类_;在Python中强制使用元类?

不应该';t_u元类_;在Python中强制使用元类?,python,oop,python-3.x,metaclass,Python,Oop,Python 3.x,Metaclass,我一直在努力学习Python中的元类。我明白了主要意思,但我似乎无法启动机制。据我所知,通过在全局或类级别将\uuu metaclass\uu设置为M,可以在构造类K时指定M为元类。为了验证这一点,我编写了以下程序: p = print class M(type): def __init__(*args): type.__init__(*args) print("The rain in Spain") p(1) class ClassMeta:

我一直在努力学习Python中的元类。我明白了主要意思,但我似乎无法启动机制。据我所知,通过在全局或类级别将
\uuu metaclass\uu
设置为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 C:\Documents and Settings\Daniel Wong\Desktop>python——版本 Python 3.0.1 C:\Documents and Settings\Daniel Wong\Desktop>python meta.py 1. 2. 3. 西班牙的雨 4. 我不应该在1点和2点之后看《西班牙的雨》吗?这是怎么回事?

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

class ClassMeta(metaclass=M):
  pass

指定
\uuuuuuuuuuuuuuuuuuuu元类属性或全局变量是Python 2.x中的旧语法,不再受支持。另请参见和。

这与Python2.6(及更早版本)中的预期一样有效,但在3.0中元类的指定不同:

class ArgMeta(metaclass=M): ...

元类的语法在Python3.0中有所不同。
\uuuuuuuuuuuuuuuuuuuuuu元类
属性在类或模块级别上都不再特殊。要执行您试图执行的操作,您需要将
元类
指定为
语句的关键字参数:

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

正如您所料。

双负“不…不强制”很难解析。你能解决这个问题吗?谢谢你的反馈。我想现在应该更容易理解了。