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

Python CoinCollector代码报'str' object is not callable错误排查

硬币金额统计功能触发TypeError报错排查

问题场景

编写硬币金额统计逻辑时,计划遍历字符串形式的硬币标识累加计算总金额,实例化CoinCollector类后调用parseChange方法传入字符串参数'PND',运行时抛出类型错误。

原始问题代码

class CoinCollector:

    def __init(self):
        self.total = 0

    def parseChange(self, coins):

            for element in coins:
                if coins(element) == P:
                    self.total += .01
                if coins(element) == N:
                    self.total += .05
                if coins(element) == D:
                    self.total += .10
                if coins(element) == Q:
                    self.total += .25
                if coins(element) == H:
                    self.total += .50
                if coins(element) == W:
                    self.total += 1.00

            return self.total

change = CoinCollector()
change.parseChange('PND')

报错信息

Traceback (most recent call last):
  File "C:\Users\gtorr\Desktop\School\Merrimack Masters\CSC6003OA\Final Project\CoinCollector.py", line 26, in <module>
    change.parseChange('PND')
  File "C:\Users\gtorr\Desktop\School\Merrimack Masters\CSC6003OA\Final Project\CoinCollector.py", line 10, in parseChange
    if coins(element) == P:
TypeError: 'str' object is not callable

错误原因

  • 核心报错原因:字符串取值写法错误。coins是传入的字符串类型参数,coins(element)是函数调用写法,字符串不是可调用对象,因此抛出类型错误。遍历字符串时for element in coins已经逐个取出了字符串里的单个硬币字符,不需要再对coins做调用操作。
  • 语法错误:判断条件里的P/N/D等硬币标识没有加引号,会被Python识别为未定义的变量,就算解决了调用错误也会触发NameError。
  • 类定义错误:Python类的构造方法固定命名为__init__(方法名前后各两个下划线),原代码写为__init缺少末尾的双下划线,实例化时不会自动执行初始化逻辑,self.total属性无法正常初始化。
  • 逻辑隐患:总金额变量没有在每次调用计算方法时重置,多次调用parseChange会累加历史计算结果,出现金额统计错误;多个独立if判断会做不必要的条件匹配,执行效率低。

修复后代码

class CoinCollector:
    # 修正构造方法命名
    def __init__(self):
        self.total = 0

    def parseChange(self, coins):
        # 每次计算前重置总金额,避免历史值干扰
        self.total = 0
        for element in coins:
            # 直接使用遍历得到的字符做判断,字符值加引号
            if element == 'P':
                self.total += .01
            elif element == 'N':
                self.total += .05
            elif element == 'D':
                self.total += .10
            elif element == 'Q':
                self.total += .25
            elif element == 'H':
                self.total += .50
            elif element == 'W':
                self.total += 1.00
        return self.total

change = CoinCollector()
# 传入PND计算结果为0.01+0.05+0.10=0.16
print(change.parseChange('PND'))

修复点说明

  • 移除错误的coins(element)调用写法,直接使用遍历得到的element变量做值匹配,解决「字符串不可调用」的核心报错
  • 给所有硬币标识字符添加单引号,明确为字符串类型值,避免未定义变量报错
  • 修正构造方法命名,确保实例属性正常初始化;新增每次计算前重置总金额的逻辑,避免多次调用结果累加错误
  • 将多个独立if判断改为elif分支,匹配到对应硬币类型后跳过后续判断,减少无效计算

内容的提问来源于stack exchange,提问作者VzlaCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:18:19