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

Python OOP继承疑问:立方体维度输出异常及代码优化咨询

问题解答

为什么立方体的维度输出是2而不是3?

shape_3D继承自shape_2D,但shape_2D的构造函数里调用super().__init__时,直接硬编码传了dimensions=2——不管你在shape_3D里给super()传什么dimensions值,shape_2D根本不会用这个参数,而是固定把2传给父类Shape的构造函数。所以最终cube的dimensions被设为2,而非你期望的3。

代码优化方案(无需手动传dimensions)

我们可以让每个子类自己固定对应的维度值,实例化时只需要传入名称和边数即可:

class Shape():
    def __init__(self, name="unknown", sides=0, dimensions=0):
        self.sides = sides
        self.dimensions = dimensions
        self.name = name
        
    def desc(self):
        print(f"A {self.name} has {self.sides} sides and {self.dimensions} dimensions")

# 2D图形类,固定维度为2,实例化只需传name和sides
class Shape2D(Shape):
    def __init__(self, name, sides):
        super().__init__(name=name, sides=sides, dimensions=2)

# 3D图形类,固定维度为3,直接继承Shape(逻辑上3D不是2D的子类)
class Shape3D(Shape):
    def __init__(self, name, sides):
        super().__init__(name=name, sides=sides, dimensions=3)

# 实例化时无需传dimensions
square = Shape2D(name="square", sides=4)
square.desc()

cube = Shape3D(name="cube", sides=6)
cube.desc()

优化点说明:

  • 把shape_2D、shape_3D改名为Shape2D、Shape3D,符合Python类的大驼峰命名规范。
  • Shape2D和Shape3D的构造函数不再接收dimensions参数,而是直接在调用父类构造时传入固定的维度值(2或3)。
  • 实例化square和cube时,只需要传入name和sides,维度由类本身确定,避免手动传参出错。
  • 调整desc方法的输出为f-string,更简洁易读。

运行优化后的代码,输出会变成:

A square has 4 sides and 2 dimensions
A cube has 6 sides and 3 dimensions

内容的提问来源于stack exchange,提问作者TeeEmDee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:05:37