【问题标题】:python class calls itself in __init__ using superpython类在__init__中使用super调用自己
【发布时间】:2017-06-30 07:49:49
【问题描述】:

我有这样的代码:

class sampleClass(object):
    def __init__(self):
        super(sampleClass, self).__init__()

我的问题是,为什么它在 __init__ 下调用自己的 super ?

我知道 super 用于调用父类的__init__,(如果我错了,请告诉我),但在这里它有什么作用?

【问题讨论】:

  • super() 返回父类。
  • 你能澄清你的问题吗? “我知道 super 用于调用父类的__init__”正是这里发生的情况。

标签: python python-3.x python-2.x super


【解决方案1】:

它不会调用它自己的__init__,这是super 的正确语法,它的第一个参数必须是类本身(super 将调用其父类的__init__ 的类名)。

在此处阅读更多信息https://docs.python.org/3.6/library/functions.html#super

super([type[, object-or-type]])

返回一个委托的代理对象 方法调用类型的父类或兄弟类。 [第一个参数]

【讨论】:

    【解决方案2】:

    据我了解,这种类型的类定义能够区分 Python 2 中的新类型类和旧类型类。但是,Python 3 根据定义仅使用新类型类。因此,如果您使用的是 Python 3,则不需要这种实现,但它有助于向后兼容。

    https://www.reddit.com/r/learnpython/comments/7vou1s/what_does_object_in_class_classnameobject_do/dttx467/?utm_source=reddit&utm_medium=web2x&context=3

    此链接包含有关 Python 2 和 Python 3 中类定义差异的更多信息。

    基本上,如果您使用的是 Python 3,您可以将您的类定义变成这个。

    class sampleClass():
        def __init__(self):
            ...
        
    

    【讨论】:

    • sampleClass 的这个定义等同于问题中显示的内容。当与多重继承一起使用时,它的行为会有所不同,无法调用其超类。
    • 请再次检查并仔细阅读。对于 Python 来说是完全一样的。我什至将我的几个代码从第一种定义类型更改为我的定义类型并且它有效!如您所见,在问题中,sampleClass 继承了object。 jsbueno 在这里解释了 link 中的对象。因此,在您提到的问题中,没有需要继承的超类。
    • 同样,在多重继承的情况下,比如class C(sampleClass, dict):,有一个不同于对象的超类。超类不是静态的,这就是使用super 而不是通过名称调用超类的全部意义。
    • 参见 Raymond Hettinger's blog on multiple inheritance 以了解超类如何通过多重继承进行更改。
    猜你喜欢
    • 1970-01-01
    • 2015-12-09
    • 2020-11-06
    • 1970-01-01
    • 2020-03-13
    • 2020-05-17
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    相关资源
    最近更新 更多