python - 与 super() 调用有点混淆
问题描述
在https://realpython.com/python-super/中,给出了如何使用 super() 初始化父类的示例。代码示例:
class Rectangle:
def __init__(self, length, width):
self.length = length
self.width = width
def area(self):
return self.length * self.width
def perimeter(self):
return 2 * self.length + 2 * self.width
class Square(Rectangle):
def __init__(self, length):
super().__init__(length, length)
super()
调用__init__()
Rectangle 类的,让你可以在 Square 类中使用它而无需重复代码。
虽然,如果我这样定义 Square 类:
class Square(Rectangle):
pass
我可以通过实例化一个对象来使用所有父级的方法:
square = Square(4,4)
调用 square.area 按预期输出 16。
在P. Dusty 的Python 3 Object Oriented Programming一书中,解释更好(第 71 页):
[...] 如果我们忽略显式调用初始化程序,超类可能会未初始化。
在从单个父类进行多重继承的情况下,作者提到:
由于类层次结构的组织,超类被多次调用的可能性
我理解后一点,这是通过一个示例进行解释的,该示例显示在多重继承的情况下可以多次调用相同的方法名称。但是,人们可能会怀疑在简单继承的情况下这是否真的会造成麻烦。另外,我看不到父类如何无法初始化...
解决方案
如果你有:
class Square(Rectangle):
pass
然后Square.__init__
将解析为Rectangle.__init__
因为Square
没有覆盖它。当您覆盖特定方法并希望为基类调用它时,您只需要调用超类。
推荐阅读
- sql - 作为 Postgresql 查询结果中最后一条记录的行总和
- apache-spark - 如何在 SparkR 中过滤列的不同值
- java - Spring Boot 使用具有特定弹簧配置文件的 gradle 创建 jar
- php - PHP - 我需要帮助,如何访问 stdClass 对象中的特定数据?
- ionic-framework - 社交分享和深度链接 - Ionic
- linux - 从软盘 FLOPPY 启动的 bochs:软盘映像上的 read() 返回 0
- python - Django 等待完成 Selenium def() 然后返回页面 - 如何改变它?
- google-bigquery - 使用连接从 BigQuery 读取批量数据
- php - Laradock 在工作区中更改 php-fpm 版本
- javascript - 将新项目添加到状态时反应表附加空行