Python中第二次调用类方法时为何触发TypeError?
问题解决:第二次调用eggs_week方法触发TypeError
你遇到的问题核心是实例属性覆盖了同名方法:
- 第一次调用
eggs_week()时,你执行了self.eggs_week = self.eggs_day * 7,这会给chicken1实例创建一个名为eggs_week的整数属性,直接把原本的eggs_week方法覆盖了。 - 第二次调用
chicken1.eggs_week()时,eggs_week已经是个整数,不是可调用的方法,因此抛出int对象不可调用的TypeError。 - 同样的问题也存在于
eggs_lifetime方法中,你用self.eggs_lifetime = sum(...)覆盖了同名方法,后续调用该方法也会出错。
另外还有逻辑漏洞:每次调用eggs_week()都执行self.eggs_list = [],会清空之前的产蛋记录,导致终身产蛋量永远只统计最后一周的数值,应该把列表初始化放到__init__方法里。
修复后的代码
class Animal: # 补充Animal父类的基础初始化逻辑 def __init__(self, name, age, color, tag): self.name = name self.age = age self.color = color self.tag = tag class EggLayers(Animal): """产蛋动物类""" type = "chicken" def __init__(self, name, age, color, tag): super().__init__(name, age, color, tag) self.eggs_list = [] # 初始化产蛋记录列表,避免每次调用方法时清空 def eggs_week(self): # 计算周产蛋量并添加到记录列表 eggs_day = int(input("今天产蛋数? ")) weekly_eggs = eggs_day * 7 # 修改属性名,避免与方法名冲突 self.eggs_list.append(weekly_eggs) print(f"{self.name}本周产蛋{weekly_eggs}枚") return weekly_eggs def eggs_lifetime(self): # 计算终身产蛋总量 total_lifetime_eggs = sum(self.eggs_list) # 修改属性名,避免与方法名冲突 print(f"{self.name}终身总产蛋量为{total_lifetime_eggs}枚") return total_lifetime_eggs chicken1 = EggLayers('chicken1', 3, 'white', '002') chicken1.eggs_week() chicken1.eggs_lifetime() chicken1.eggs_week() # 第二次调用不再报错
关键修改点
- 修改实例属性名,避免与方法名重名覆盖(比如
self.eggs_week改为weekly_eggs)。 - 将
self.eggs_list = []移到__init__方法中,保证产蛋记录会被持续追加而非清空。
内容的提问来源于stack exchange,提问作者Ryan R. McKnight
相关产品推荐
相关产品推荐

