给定Python 2元类定义为:
class Meta(type):
def __init__(cls, name, bases, dct):
pass
dct
参数的目的是什么?根据我发现的内容,它包含与cls.__dict__
相同的信息。不同之处在于对dct
进行更改对具体类没有影响,但向cls.__dict__
添加内容(即cls.__dict__['a']=True
或cls.a=True
)会产生影响。
class Meta(type):
def __init__(cls, name, bases, dct):
cls.a = True
dct['b'] = True
class Test(object):
__metaclass__ = Meta
t = Test()
print t.a
print t.b # Raises an AttributeError
是否有不同的情况?
答案 0 :(得分:2)
dct
参数为您提供了原始的类名称空间,因此它未在元类__init__
中使用,因为该类已在__new__
中创建。 dct
和cls.__dict__
可能相同,但它们不是同一个字典。在您可能需要原始命名空间中包含的信息而不需要__new__
方法或父元类执行任何操作的情况下,它可能很有用。
如果__new__
方法正在向类中添加属性 - 在创建之后 - 它们不在原始命名空间中,它们可能会有所不同。