元类__init__方法的dct参数的目的是什么?

时间:2015-12-15 16:28:39

标签: python python-2.x metaclass

给定Python 2元类定义为:

class Meta(type):
  def __init__(cls, name, bases, dct):
    pass

dct参数的目的是什么?根据我发现的内容,它包含与cls.__dict__相同的信息。不同之处在于对dct进行更改对具体类没有影响,但向cls.__dict__添加内容(即cls.__dict__['a']=Truecls.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

是否有不同的情况?

1 个答案:

答案 0 :(得分:2)

dct参数为您提供了原始的类名称空间,因此它未在元类__init__中使用,因为该类已在__new__中创建。 dctcls.__dict__可能相同,但它们不是同一个字典。在您可能需要原始命名空间中包含的信息而不需要__new__方法或父元类执行任何操作的情况下,它可能很有用。

如果__new__方法正在向类中添加属性 - 在创建之后 - 它们不在原始命名空间中,它们可能会有所不同。