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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:45:24