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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:09:31