夏瑾 发表于 2025-5-18 19:06:42

第63章节练习出现BUG

class Shape():
    def __init__(self,name):
      self.name=name
      #print(name)
    def area(self):
      pass

class Square(Shape):
    def __init__(self,length):
      super().__init__("正方形")
      self.length=length
    def area(self):
      return self.length*self.length

class Circle(Shape):
    def __init__(self,radius):
      super().__init__("圆形")
      self.radius=radius
    def area(self):
      return3.14*self.radius*self.radius

class Triangle(Shape):
    def __init__(self):
      super().__init__("三角形")
    def area(self,base,height):
      self.base=base
      self.height=height
      return self.base*self.height/2


s=Square(5)
s.name()
t=Triangle()
c=Circle(6)
s.area()
t.area(3,4)
c.area()

代码运行提示:
Traceback (most recent call last):
File "C:\python学习\text.py", line 40, in <module>
    s.name()
TypeError: 'str' object is not callable

FishC 发表于 2025-5-18 19:07:28

问题分析与解决方案

该代码存在两个主要问题:

1. 错误调用name属性
在最后测试代码时执行了 s.name(),但name是属性而不是方法。Shape类中的name是字符串类型属性,应该直接访问而非调用

2. 三角形类参数设计问题
Triangle类的area方法需要额外参数,这与父类Shape中定义的area()无参数形式冲突,破坏了多态性

修正后的代码:


class Shape():
    def __init__(self,name):
      self.name = name# name是实例属性
    def area(self):
      pass

class Square(Shape):
    def __init__(self, length):
      super().__init__("正方形")
      self.length = length
    def area(self):
      return self.length ** 2

class Circle(Shape):
    def __init__(self, radius):
      super().__init__("圆形")
      self.radius = radius
    def area(self):
      return 3.14 * self.radius ** 2

class Triangle(Shape):
    def __init__(self, base, height):
      super().__init__("三角形")
      self.base = base   # 应该在初始化时接收参数
      self.height = height
    def area(self):
      return self.base * self.height / 2# 保持与父类参数一致

# 正确调用方式
s = Square(5)
print(s.name)# 直接访问属性,去掉括号

t = Triangle(3, 4)# 初始化时传入参数
c = Circle(6)

print(s.area())# 25
print(t.area())# 6.0
print(c.area())# 113.04


主要修改点:
1. 将Triangle的参数接收改到__init__方法中
2. 使所有子类的area()保持无参数形式
3. 修正name属性的访问方式(去掉调用括号)
4. 添加了实际输出结果的print语句

建议再仔细检查类的方法参数设计,保持继承体系中方法签名的统一性。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

pyzyd 发表于 2025-5-18 19:10:38

name是属性,不是方法,不需要加括号,交互模式直接s.name就行,或者print(s.name)

player-none 发表于 2025-5-18 19:23:53

有没有一种可能,s.name 是一个字符串,像"abc"一样,而"abc"()会报错
去掉括号
页: [1]
查看完整版本: 第63章节练习出现BUG