第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 问题分析与解决方案
该代码存在两个主要问题:
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 小助理,如未能正确解答您的问题,请继续追问。 name是属性,不是方法,不需要加括号,交互模式直接s.name就行,或者print(s.name) 有没有一种可能,s.name 是一个字符串,像"abc"一样,而"abc"()会报错
去掉括号
页:
[1]