【发布时间】:2019-12-22 06:00:06
【问题描述】:
我已经看到一些 Python 元类的示例使用 super() 调用 type.__init__()。这是做什么的?
例子:
class Meta(type):
def __new__(cls, name, bases, dct):
dct['a']='a'
cls_obj = super(Meta, cls).__new__(cls, name, bases, dct)
return cls_obj
def __init__(cls_obj, name, bases, dct):
cls_obj.b = 'b'
dct['c'] = 'c'
#what does this do
super(Meta, cls_obj).__init__(name, bases, dct)
class Meta2(Meta):
def __init__(cls_obj, name, bases, dct):
cls_obj.b = 'b'
class Klass(metaclass=Meta):
pass
class Klass2(metaclass=Meta2):
pass
if __name__ == '__main__':
print(Klass.a)
print(Klass.b)
print(Klass.c)
输出:
a
b
<...my system traceback...>
AttributeError: type object 'Klass' has no attribute 'c'
显然dct 不用于更新Klass.__dict__。据我所知,这没有任何作用。它有什么作用吗?您是否有理由想要包含它? Klass 和 Klass2 之间有什么有效区别吗?
注意:我说的是Meta 继承自type 的情况,而不是某个自定义超类。
【问题讨论】:
标签: python metaclass python-internals