在名为exp.py的文件中(如下所示),我正在尝试理解Python中的元类。当元类的__new__方法使用'type'构造函数来构造一个类时,似乎它的__new__方法不会被使用它作为元类的类的子类调用:
正如您所看到的,当类F被加载时,元类D的
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
print
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
在终端中:
>>> 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的
__new__
方法并未被调用。(如果已经调用,则会打印有关类F的信息。)请问是否有人可以帮我解释一下这个问题?
相关文章:我正在阅读Python中的元类是什么?,在这句话中似乎遇到了类似的东西,“请注意,在这里__metaclass__
属性不会被继承,父类(Bar.__class__
)的元类会被继承。如果Bar使用一个创建Bar的type()
(而不是type.__new__()
)的__metaclass__
属性,那么子类将不会继承该行为。”但是我没有完全理解。
__class__
属性,如果没有找到,则使用其类型)”。1.在什么情况下会找不到__class__
属性?2.在什么情况下类的__class__
属性会与其类型(使用type()
确定)不同?谢谢。 - platypustype()
输出也不同。对于新式类别,默认类型是type
,而对于旧式类别,则为classobj
。新式和经典类别。 - Ashwini Chaudhary