首页 > 解决方案 > 与 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 页):

[...] 如果我们忽略显式调用初始化程序,超类可能会未初始化。

在从单个父类进行多重继承的情况下,作者提到:

由于类层次结构的组织,超类被多次调用的可能性

我理解后一点,这是通过一个示例进行解释的,该示例显示在多重继承的情况下可以多次调用相同的方法名称。但是,人们可能会怀疑在简单继承的情况下这是否真的会造成麻烦。另外,我看不到父类如何无法初始化...

标签: pythonpython-3.xoop

解决方案


如果你有:

class Square(Rectangle):
    pass

然后Square.__init__将解析为Rectangle.__init__因为Square没有覆盖它。当您覆盖特定方法并希望为基类调用它时,您只需要调用超类。


推荐阅读