Python metaclass behavior (not calling __new__), is there an explanation?
在一个名为exp.py的文件中(下面),我试图理解Python中的元类。似乎当元类的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class A(type): def __new__(cls, name, bases, dct): print"cls is: ", cls print"name is: ", name print"bases is:", bases print"dct is: ", dct return super(A, cls).__new__(cls, name, bases, dct) class B(object): __metaclass__ = A class C(B): pass class D(type): def __new__(cls, name, bases, dct): print"cls is: ", cls print"name is: ", name print"bases is:", bases print"dct is: ", dct return type(name, bases, dct) class E(object): __metaclass__ = D class F(E): pass |
在终端中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | >>> from exp import * cls is: <class 'exp.A'> name is: B bases is: (<type 'object'>,) dct is: {'count': 0, '__module__': 'exp', '__metaclass__': <class 'exp.A'>, '__init__': <function __init__ at 0x107eb9578>} cls is: <class 'exp.A'> name is: C bases is: (<class 'exp.B'>,) dct is: {'__module__': 'exp'} cls is: <class 'exp.D'> name is: E bases is: (<type 'object'>,) dct is: {'count': 0, '__module__': 'exp', '__metaclass__': <class 'exp.D'>, '__init__': <function __init__ at 0x107ebdb18>} >>> |
号
如您所见,在加载类F的定义时,不会调用元类D的
有人能帮我解释一下吗?
相关文章:我在读什么是Python中的元类?并且在句子中似乎遇到了类似的情况,"注意这里的
在第二种情况下,不是返回元类的实例,而是实际返回
- 如果存在
dict['__metaclass__'] ,则使用它。 - 否则,如果至少有一个基类,则使用其元类(这将首先查找
__class__ 属性,如果找不到,则使用其类型)。
因此,正确的方法是在元类的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class D(type): def __new__(cls, name, bases, dct): print"cls is: ", cls print"name is: ", name print"bases is:", bases print"dct is: ", dct return type.__new__(cls, name, bases, dct) class E(object): __metaclass__ = D class F(E): pass class A(object): pass |
输出:
1 2 3 4 5 6 7 8 | cls is: <class '__main__.D'> name is: E bases is: (<type 'object'>,) dct is: {'__module__': '__main__', '__metaclass__': <class '__main__.D'>} cls is: <class '__main__.D'> name is: F bases is: (<class '__main__.E'>,) dct is: {'__module__': '__main__'} |
号