在元类编码中,元超级的__init __"的作用?

时间:2017-05-03 02:43:15

标签: python

这听起来像一个简单的问题,但我无法在网站上找到直截了当的答案。

示例代码:(大多数情况下,人们会以这种方式编写元类。)

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)的作用是什么?从技术上讲(很多网络示例),你可以删除这个语句,而不会遇到任何错误。非常混乱。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

查看implementation of type.__init__它似乎没有什么特别有趣的 - 它错误检查参数的数量,然后调用object.__init__

object.__init__的实施也不是非常有趣。再次输入检查参数的数量。

因此,虽然调用type.__init__(...)(通过super())实际上并没有做太多任何事情,但如果你要覆盖的话,调用超类的方法只是最好的做法,为什么你会常见它(甚至在一个几乎没有任何东西的元类中)。有super()的有趣案例发生在你多次继承的时候(我认为在技术上可以使用元类,但我个人强烈反对这一点 - 鉴于你实现了一个元类,你已经有了足够的魔法)