You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码问题分析及优化方案

  1. 父类设计偏离需求:要求父类有统一的inputSides()方法,但你写了三个独立的inputSidesC/R/T方法,完全没用到继承的复用性,每个子类应该重写父类的inputSides()来适配自身输入逻辑。
  2. 无效的实例化调用:父类方法里的circle()、rectangle()只是创建新对象,和当前操作的实例无关,而且不会自动触发area()计算——你提供的运行结果里的面积输出,实际原代码是跑不出来的。
  3. 圆的面积公式错误:圆的面积是π×r²,你写成了π×(r×2),这是周长公式。
  4. 子类初始化冗余:子类继承了父类的属性,不需要在__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:01:00