Python面向对象编程:三角形面积计算代码错误排查
三角形面积计算代码错误排查与修正
原代码存在的问题
- 构造方法定义错误:Python类的初始化方法必须是
__init__,而非直接以类名作为方法名;类定义时不能将self作为类的参数,self是实例方法的第一个参数,仅在方法内部用来引用实例本身。 - 参数设计不符合需求:原构造方法要求必须传入所有四个参数,但需求是两种独立场景(已知三边/已知两边+夹角),应支持可选参数,避免强制传入无关参数。
- 实例方法缺少
self参数:类中的实例方法必须以self作为第一个参数,用于访问实例存储的属性,原方法直接传入参数,完全没利用实例已有的属性。 - 面积计算公式错误:
area方法直接将三边相乘,这不是三角形面积公式,已知三边需使用海伦公式计算。area_of_given_angle方法缺少1/2的系数,且未导入math模块;若传入的是角度(度数),需先转换为弧度才能用math.sin计算。
- 无输入合法性校验:未检查三边是否满足三角形三边关系(任意两边之和大于第三边),也未校验夹角的范围(0°<角度<180°),容易产生无效计算。
修正后的代码
import math class Triangle: def __init__(self, side_A=None, side_B=None, side_C=None, angle=None): self.side_A = side_A self.side_B = side_B self.side_C = side_C self.angle = angle # 单位:度数 def area_by_three_sides(self): # 校验三边参数是否完整且合法 if not all([self.side_A, self.side_B, self.side_C]): raise ValueError("请传入完整的三边长度") a, b, c = self.side_A, self.side_B, self.side_C if a + b <= c or a + c <= b or b + c <= a: raise ValueError("三边长度不满足三角形构成条件") # 海伦公式计算面积 semi_perimeter = (a + b + c) / 2 return math.sqrt(semi_perimeter * (semi_perimeter - a) * (semi_perimeter - b) * (semi_perimeter - c)) def area_by_two_sides_and_angle(self): # 校验两边及夹角参数是否完整且合法 if not all([self.side_A, self.side_B, self.angle]): raise ValueError("请传入两边长度及夹角(度数)") if not 0 < self.angle < 180: raise ValueError("夹角必须在0到180度之间") # 转换角度为弧度,计算面积 angle_rad = math.radians(self.angle) return 0.5 * self.side_A * self.side_B * math.sin(angle_rad) # 使用示例 if __name__ == "__main__": # 已知三边计算面积 tri_with_three_sides = Triangle(side_A=3, side_B=4, side_C=5) print("三边为3,4,5的三角形面积:", tri_with_three_sides.area_by_three_sides()) # 已知两边及夹角计算面积 tri_with_two_sides_angle = Triangle(side_A=3, side_B=4, angle=90) print("两边3,4及夹角90度的三角形面积:", tri_with_two_sides_angle.area_by_two_sides_and_angle())
修正说明
- 拆分两种计算场景为独立方法,命名更清晰,符合单一职责原则。
- 构造方法使用可选参数,支持两种场景的初始化方式。
- 添加参数合法性校验,避免无效输入导致错误结果。
- 修复公式错误,补充
math模块导入,处理角度转弧度的问题。
内容的提问来源于stack exchange,提问作者NoiseProgrammar
相关产品推荐
相关产品推荐

