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
相关产品推荐
相关产品推荐

