Python类在__init__中使用super调用自身

6

我有一个这样的代码:

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

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

我知道super用于调用父类的__init__函数,(如果我错了请告诉我)但这里它是干什么的呢?


super() 返回父类。 - Daniel Roseman
你能澄清一下你的问题吗?“我知道super用于调用父类的__init__”这正是在这里发生的事情。 - MisterMiyagi
2个回答

3
它不会调用自己的__init__,这是super的正确语法,其中第一个参数必须是类本身(super将调用其父类的__init__)。
点击此处了解更多信息。

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

返回代理对象,将方法调用委托给类型的父类或同级类。[第一个参数]


1
这并没有真正解释这里发生了什么,有人能详细说明一下吗?我也很感兴趣。 - Hannes Ziegler
1
@HannesZiegler 我发现这个网站很有用 https://realpython.com/python-super/#a-super-deep-dive - Ouroboroski

-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的定义与问题中显示的内容不相同。当使用多重继承时,它的行为会有所不同,无法调用其超类。 - MisterMiyagi
请再次检查并仔细阅读。对于Python来说,它完全相同。我甚至将我的一些代码从第一种定义方式更改为我的定义方式,它也可以工作!正如您在问题中所看到的,sampleClass 继承了 object。jsbueno 在这里 链接 解释了 object 是什么。因此,在问题中没有需要继承的超类,就像您提到的那样。 - Bahad
在多重继承的情况下,例如“class C(sampleClass, dict):”,存在一个与object不同的超类。超类不是静态的,这就是使用“super”而不是通过名称调用超类的全部意义所在。 - MisterMiyagi
请参考Raymond Hettinger关于多继承的博客,了解超类如何通过多重继承进行更改的解释。 - MisterMiyagi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接