不带参数调用超级初始化方法

问题描述

我有一个关于 super().__init__() 方法的问题。根据 W3SCHOOLS 的定义和用法(超级)是:

但是我真的不明白为什么以及在哪里可以使用 super().__init__() 中没有任何参数的 __init__ 方法(因为,即使没有 super__init__只要我们在括号中插入父类名称,就会调用父类)。

我是面向对象编程的新手,所以我只是想了解它是如何工作的!!!

为了帮助您理解我的问题,请参见以下示例:

class Rectangle:
    def __init__(self,length,width):
        self.length = length
        self.width = width

    def area1(self):
        return self.length * self.width

class Square(Rectangle):
    def __init__(self,length):
        super().__init__(length,length)

square = Square(4)
square.area()

这里我们使用它是因为我们需要在Rectangle类
上定义self.length,self.width(我们插入长度,长度)。

但是我不知道为什么我们像下一个例子那样在没有任何参数的情况下使用它。
因为我知道我们可以访问父类方法属性,而无需调用super。

class Example(QMainWindow):
    
    def __init__(self):
        super().__init__()
                
        self.lineEntry = QLineEdit(self)
        self.lineEntry.move(16,16)
        self.lineEntry.resize(200,40)
  
        self.setGeometry(50,50,320,200)
        self.setwindowTitle("QLineEdit Example")
        self.show()
        

        app = QApplication(sys.argv)
        ex = Example()
        sys.exit(app.exec_())

解决方法

并非每个属性都传递给构造函数 - 有些可能是私有属性,在构造函数中分配了默认值。此外,父类的构造函数可能会做一些不只是分配属性的事情,比如设置缓存。没有 super().__init__(),它们将无法运行。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...