【问题标题】:calling super init method without arguments调用不带参数的超级初始化方法
【发布时间】:2021-06-02 15:00:11
【问题描述】:

我对@9​​87654322@ 方法有疑问。根据 W3SCHOOLS 的定义和用法(super)是:

  • super() 函数用于授予对父类或兄弟类的方法和属性的访问权限。

  • super() 函数返回一个代表父类的对象。

但是我真的不明白为什么以及在哪里可以使用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
(我们插入长度,长度)。

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

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_())

【问题讨论】:

  • 如果父类的__init__() 方法需要参数,则需要传递参数。这与调用任何其他函数或方法没有什么不同。
  • “根据 W3SCHOOLS”只是提醒一下,这并不是最好的资源。一般最好参考the official docs

标签: python class init super


【解决方案1】:

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

【讨论】:

  • 是的,但是为什么人们说 super 可以帮助您,访问父类的方法和属性?我这么说是因为即使不使用它也可以访问它们!例如,你能看看我创建的这段代码吗? codepile.net/pile/xyQew9yk
  • 那是因为如果你不提供__init__,它会从父级继承并调用父级的__init__,这就是该示例有效的原因。但是,如果您在子类中覆盖 __init__,则不会调用 animal__init__
  • w3schools 的教程质量非常有问题,所以我可以看出它们的定义是多么令人困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 2016-03-26
相关资源
最近更新 更多