Python MoneyChecker类代码运行结果与预期不符问题排查
钞票校验代码问题排查
核心错误原因
checker方法的判断逻辑完全没有绑定调用方法的实例本身,硬编码依赖全局变量money1和money2:
- 不管是
money1还是money2调用checker(),方法执行的第一个判断永远是检查全局变量money1.amount是否等于200。由于初始化时已经把money1.amount固定设为200,这个判断条件永远成立,调用money2.checker()时会直接命中该分支返回脏钞结果,后面的清洁钞判断逻辑根本没有执行机会。 - 代码里还存在一处会直接导致运行报错的笔误:
money2.amount = [100][1]是对仅含单个元素的列表取索引为1的值,Python列表索引从0开始,这行正常执行会抛出IndexError: list index out of range,能得到运行结果说明这行是粘贴或书写时的错误。 - 类定义写法不规范:将
type、amount直接定义在类下属于类属性,所有类实例会共享这两个值,很容易出现属性被意外覆盖的问题,实例属性应该统一写在__init__初始化方法中。
修正后的可运行代码
class MoneyChecker: def __init__(self, amount, note_type): self.amount = amount self.type = note_type def checker(self): # 所有判断基于当前实例自身属性,不依赖外部全局变量 if self.amount >= 200: return "The %d %s is a dirty note" % (self.amount, self.type) else: return "The %d %s is a clean note" % (self.amount, self.type) money1 = MoneyChecker(200, "Naira") money2 = MoneyChecker(100, "Naira") print(money1.checker()) print(money2.checker())
运行输出
The 200 Naira is a dirty note The 100 Naira is a clean note
内容的提问来源于stack exchange,提问作者Jimoh Temidayo
相关产品推荐
相关产品推荐

