Python继承问题:filled值始终为True且子类构造无法初始化父类属性
问题修复方案
问题1:输入0时filled始终为True的修复
原因
bool(input(...))的判断逻辑是:只要输入的字符串非空,转换为布尔值就会返回True。比如输入"0"时,bool("0")返回True,因为它不是空字符串,这和你预期的0对应False不符。
解决代码
替换原有的filling赋值行,先把输入转为整数再转布尔值:
filling = bool(int(input("enter 1 for a filled triangle and 0 for an empty one: ")))
或者更严谨的写法(避免非数字输入的问题):
fill_input = input("enter 1 for a filled triangle and 0 for an empty one: ").strip() filling = fill_input == "1"
问题2:子类构造方法无法同时初始化父类属性的修复
原因
原Triangle类的构造方法没有接收color和filled参数,也没有将参数传递给父类的构造方法,导致无法在创建对象时直接初始化父类属性。
解决代码
修改Triangle的构造方法,添加对应参数并传递给父类:
class Triangle(GeometricObject): def __init__(self, side1=1.0, side2=1.0, side3=1.0, color="green", filled=None): super().__init__(color, filled) # 调用父类构造方法初始化颜色和填充属性 self.side1 = side1 self.side2 = side2 self.side3 = side3
之后创建对象时可直接传入所有参数,无需再调用setColor和setFilled:
triangle1 = Triangle(s1, s2, s3, color, filling)
额外小bug修复
原代码中setSide2方法的参数名写错了,修正为:
def setSide2(self, side2): self.side2 = side2
完整修复后的代码
import math class GeometricObject: def __init__(self, color="green", filled=None): self.__color = color self.__filled = filled def getColor(self): return self.__color def setColor(self, color): self.__color = color def setFilled(self, filled): self.__filled = filled def isFilled(self): return self.__filled def __str__(self): return f"color: {self.__color} and filled: {self.__filled}" class Triangle(GeometricObject): def __init__(self, side1=1.0, side2=1.0, side3=1.0, color="green", filled=None): super().__init__(color, filled) self.side1 = side1 self.side2 = side2 self.side3 = side3 def setSide1(self, side1): self.side1 = side1 def setSide2(self, side2): self.side2 = side2 def setSide3(self, side3): self.side3 = side3 def getArea(self): s = (self.side1 + self.side2 + self.side3)/2 area = math.sqrt(s * (s - self.side1) * (s - self.side2) * (s - self.side3)) return area def getPerimeter(self): return self.side1 + self.side2 + self.side3 def __str__(self): return f"{super().__str__()} Triangle: side1 = {self.side1} side2 = {self.side2} side3 = {self.side3}" s1, s2, s3 = eval(input("please enter the three sides of the triangle seperated by commas: ")) color = input("please enter the color of this triangle: ") filling = bool(int(input("enter 1 for a filled triangle and 0 for an empty one: "))) triangle1 = Triangle(s1, s2, s3, color, filling) print("The area of this triangle is: ", round(triangle1.getArea()), "m^2" ) print("The perimeter of this triangle is: ", triangle1.getPerimeter(), "m") print("The color of this triangle is: ", triangle1.getColor()) print("The filling value: ", triangle1.isFilled())
内容的提问来源于stack exchange,提问作者dareen42
相关产品推荐
相关产品推荐

