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
相关产品推荐
相关产品推荐

