Python子类继承父类设置参数默认值报错的解决方法
报错原因分析
- 第一类报错
non-default argument follows default argument触发原因:Python语法要求函数/方法定义中,带默认值的参数必须放在所有无默认值参数的后面。你之前尝试给no_of_sides设置默认值4时,大概率是把该参数放在了side_length的前面,导致无默认值的side_length跟在带默认值的no_of_sides之后,触发语法校验错误。 - 第二类
TypeError报错触发原因:你当前版本的Square类__init__方法要求传入2个位置参数no_of_sides、side_length,但实例化Square(5)时仅传入了1个参数,该参数会被分配给第一个形参no_of_sides,第二个形参side_length没有收到传值,因此报错。且当前写法存在逻辑冗余:先把自定义的no_of_sides传给父类初始化,随后又强行覆写为4,相当于父类初始化时传入的no_of_sides完全无效。
修复方案
正方形的边数固定为4,不需要开放为可传入参数,直接在子类初始化时固定给父类传值4即可,修改后的完整代码如下:
class RegularPolygon: def __init__(self, no_of_sides, side_length): self.no_of_sides = no_of_sides self.side_length = side_length def perimeter(self): keliling_poligon = self.no_of_sides * self.side_length return keliling_poligon def interior_angle(self): int_angle = (self.no_of_sides - 2) * 180/self.no_of_sides return int_angle def exterior_angle(self): ext_angle=360/self.no_of_sides return ext_angle class Square(RegularPolygon): # 仅保留边长作为入参即可 def __init__(self, side_length): # 固定边数4传给父类初始化 super().__init__(no_of_sides=4, side_length=side_length) def area(self): area_square = self.side_length**2 return area_square def diagonal(self): diagonal_square = self.side_length*(2**0.5) return diagonal_square square_1 = Square(5) s_perim = square_1.perimeter() s_area = square_1.area() angl_int = square_1.interior_angle() angl_ext = square_1.exterior_angle() diagonal = square_1.diagonal() result = (s_perim, s_area, angl_int, angl_ext, diagonal) print(result)
运行结果
代码运行后输出如下:
(20, 25, 90.0, 90.0, 7.071067811865476)
如果确实有需要保留no_of_sides自定义能力的特殊场景,只需要调整参数顺序,把带默认值的参数放在最后即可,写法如下:
def __init__(self, side_length, no_of_sides=4): super().__init__(no_of_sides, side_length)
该写法既不会触发语法报错,也支持仅传入边长实例化对象。
内容的提问来源于stack exchange,提问作者queengambit
相关产品推荐
相关产品推荐

