这听起来像一个简单的问题,但我无法在网站上找到直截了当的答案。
示例代码:(大多数情况下,人们会以这种方式编写元类。)
class MyMeta(type):
def __new__(meta, name, bases, dct):
return super(MyMeta, meta).__new__(meta, name, bases, dct)
def __init__(cls, name, bases, dct):
print "Initializing class", name
super(MyMeta, cls).__init__(name, bases, dct)
我的问题:
(1)super(MyMeta, cls)
部分中__init__
到底指的是什么?鉴于MyMeta
是来自type
的obj,那么此super(MyMeta, cls)
应该引用类型' s __init__
,我是否正确?
(2)很容易理解super(MyMeta, meta).__new__.....
。这应该调用type.__new__
并开始创建目标类。这个陈述是必须的。没有它,它无法完成创建课程。但是,super(MyMeta, cls).__init__(name, bases, dct)
的作用是什么?从技术上讲(很多网络示例),你可以删除这个语句,而不会遇到任何错误。非常混乱。
感谢您的帮助。
答案 0 :(得分:0)
查看implementation of type.__init__它似乎没有什么特别有趣的 - 它错误检查参数的数量,然后调用object.__init__
。
object.__init__
的实施也不是非常有趣。再次输入检查参数的数量。
因此,虽然调用type.__init__(...)
(通过super()
)实际上并没有做太多任何事情,但如果你要覆盖的话,调用超类的方法只是最好的做法,为什么你会常见它(甚至在一个几乎没有任何东西的元类中)。有super()
的有趣案例发生在你多次继承的时候(我认为在技术上可以使用元类,但我个人强烈反对这一点 - 鉴于你实现了一个元类,你已经有了足够的魔法)