Python面向对象编程:Shape类及子类面积计算问题求助
编程问题求助:图形类的继承与实现优化
我是编程初学者,需求如下:
- 创建名为
shape的父类,包含inputSides()方法用于获取用户输入的图形边长 - 创建
circle、rectangle、triangle三个子类,各子类需实现area()方法,利用父类的边长值计算面积
以下是我编写的代码及运行结果,但仍存在困惑,寻求技术帮助:
class shape(): def __init__(self, r = None, s1 = None, s2 = None, b = None, h = None): self.radius = r self.side1 = s1 self.side2 = s2 self.base = b self.height = h def inputSidesC(self): self.radius = int(input("Enter radius: ")) circle() def inputSidesR(self): self.side1 = int(input("Enter side 1: ")) self.side2 = int(input("Enter side 2: ")) rectangle() def inputSidesT(self): self.base = int(input("Enter base: ")) self.height = int(input("Enter height: ")) triangle() class circle(shape): def __init__(self, r = None): self.radius = r def area(self): pi = 3.14159265359 print("Area of circle: ", pi * (self.radius * 2)) class rectangle(shape): def __init__(self, s1 = None, s2 = None): self.side1 = s1 self.side2 = s2 def area(self): print("area of rectangle", self.side1 * self.side2) class triangle(shape): def __init__(self, b = None, h = None): self.base = b self.height = h def area(self): print("Area of triangle: ", 0.5 * self.base * self.height) c = circle() c.inputSidesC() r = rectangle() r.inputSidesR() t = triangle() t.inputSidesT()
运行结果:
Enter radius: 2 Area of circle: 12.57 Enter side 1: 2 Enter side 2: 4 Area of rectangle: 8 Enter base: 2 Enter height: 4 Area of triangle: 4
代码问题分析及优化方案
- 父类设计偏离需求:要求父类有统一的
inputSides()方法,但你写了三个独立的inputSidesC/R/T方法,完全没用到继承的复用性,每个子类应该重写父类的inputSides()来适配自身输入逻辑。 - 无效的实例化调用:父类方法里的
circle()、rectangle()只是创建新对象,和当前操作的实例无关,而且不会自动触发area()计算——你提供的运行结果里的面积输出,实际原代码是跑不出来的。 - 圆的面积公式错误:圆的面积是
π×r²,你写成了π×(r×2),这是周长公式。 - 子类初始化冗余:子类继承了父类的属性,不需要在
__init__里重新定义,直接复用父类逻辑即可。
优化后的代码
import math class Shape: def inputSides(self): # 父类定义抽象方法,强制子类必须实现 raise NotImplementedError("子类必须重写inputSides方法") class Circle(Shape): def __init__(self): self.radius = None def inputSides(self): self.radius = int(input("Enter radius: ")) def area(self): area = math.pi * self.radius ** 2 print(f"Area of circle: {area:.2f}") class Rectangle(Shape): def __init__(self): self.side1 = None self.side2 = None def inputSides(self): self.side1 = int(input("Enter side 1: ")) self.side2 = int(input("Enter side 2: ")) def area(self): area = self.side1 * self.side2 print(f"Area of rectangle: {area}") class Triangle(Shape): def __init__(self): self.base = None self.height = None def inputSides(self): self.base = int(input("Enter base: ")) self.height = int(input("Enter height: ")) def area(self): area = 0.5 * self.base * self.height print(f"Area of triangle: {area}") # 调用示例 c = Circle() c.inputSides() c.area() r = Rectangle() r.inputSides() r.area() t = Triangle() t.inputSides() t.area()
优化说明
- 父类
Shape定义抽象方法,强制子类实现各自的输入逻辑,符合面向对象多态特性。 - 每个子类只处理自身需要的边长输入,逻辑清晰不冗余。
- 修复圆的面积公式,用
math.pi获取更精确的圆周率。 - 明确调用
area()方法完成计算输出,逻辑连贯。 - 类名采用大驼峰命名法,符合Python代码规范。
内容的提问来源于stack exchange,提问作者Valentine Lancin
相关产品推荐
相关产品推荐

