为什么Square类的super().__init__()方法要传入两次length参数?
核心原因可以从两个层面理解:
- 父类构造方法的参数强制要求
你写的super().__init__本质是调用父类Rectangle的构造方法,看父类的__init__定义就知道,它要求传入length和width两个位置参数,少传任何一个都会直接触发参数不匹配的报错。 - 正方形的属性特性适配
正方形的核心特点就是长和宽完全相等,所以Square类的构造方法只需要接收一个length参数就够了,给父类传参时把长和宽都赋值为这个length,刚好符合正方形的属性定义,后续调用从父类继承来的area()、perimeter()方法也能直接得到正确结果,不需要再单独重写这两个方法,最大化复用了父类的代码。
你可以试下修改代码做验证:
# 正常传两个参数的运行效果 s = Square(5) print(s.area()) # 输出25,符合正方形5*5的面积计算逻辑 print(s.perimeter()) # 输出20,符合正方形2*5+2*5的周长计算逻辑 # 如果只传一个参数,运行直接报错 # 错误写法:super().__init__(length) # 报错信息:TypeError: Rectangle.__init__() missing 1 required positional argument: 'width'
内容的提问来源于stack exchange,提问作者josefrank
相关产品推荐
相关产品推荐

