Python Money类代码无报错却无法执行,请求排查问题
问题排查与修复方案
嘿,我帮你找出问题所在了!你的代码完全没反应、不执行也不报错的核心原因其实非常直观,同时还有几个潜在的bug会导致你调用后报错,我一一给你拆解:
1. 最关键的问题:程序根本没被触发执行
你定义了main()函数来处理用户输入和实例化,但从来没有调用这个函数。Python脚本运行时只会执行顶级代码(也就是函数定义之外的代码),函数本身的定义不会自动运行。所以你必须在脚本末尾加上触发代码:
if __name__ == "__main__": main()
这样当你运行脚本时,才会执行main()里的输入和打印逻辑。
2. 类初始化的参数错误
Money类的__init__方法明确要求传入euro和cent两个参数,但你在两个地方都直接空实例化Money():
main()里的x = Money()debt方法里的value = Money()
这会直接抛出TypeError,因为缺少必要的位置参数——不过因为你没调用main(),所以这个错误还没暴露出来。
修复方式:
- 在
main()里,应该先获取用户输入,再用输入值实例化Money:def main(): euro = int(input("Type in your EURO amount: \n")) cent = int(input("Type in your CENT amount: \n")) x = Money(euro, cent) print(x) - 在
debt方法里,先计算好总euro和cent的值,再传入Money的构造函数:def debt(self, years, rate): multiply = rate * years * 12 / 100 # 先计算总金额的分数,避免小数误差 total_cent = (self.euro * 100 + self.cent) * multiply # 转换回euro和cent total_euro = int(total_cent // 100) remaining_cent = int(total_cent % 100) value = Money(total_euro, remaining_cent) return value
3. 其他潜在的逻辑问题
__str__方法里用了/做除法,在Python3里这会得到浮点数,导致self.euro变成小数(比如1.5 EUR),不符合货币逻辑,应该用//整数除法来处理进位。changeCent和changeSum方法的逻辑混乱,比如changeSum里的参数euros被重新赋值,完全覆盖了传入的参数,建议重新梳理转换逻辑,比如改成更清晰的to_cent()(转成总分数)和from_cent()(从总分数转回euro+cent)方法。debt方法里的进位处理不彻底,value.cent = value.cent - 100只能处理一次进位,如果cent是250,减100后还是150,仍然大于100,应该用取模value.cent % 100来彻底处理。
修复后的完整可运行代码
class Money(object): def __init__(self, euro, cent): # 初始化时就处理cent的进位,确保cent始终在0-99之间 extra_euro = cent // 100 self.euro = euro + extra_euro self.cent = cent % 100 def __str__(self): return f"{self.euro} EUR & {self.cent} cents" def to_cent(self): # 转换为总分数,方便计算 return self.euro * 100 + self.cent def debt(self, years, rate): # 计算总倍率(这里假设rate是月利率,因为乘了12) multiply = rate * years * 12 / 100 # 用总分数计算,避免浮点数误差 total_cent = self.to_cent() * multiply # 转换回Money实例 return Money(0, int(total_cent)) def main(): euro = int(input("Type in your EURO amount: \n")) cent = int(input("Type in your CENT amount: \n")) x = Money(euro, cent) print(x) # 可选:测试debt方法 # debt_result = x.debt(1, 5) # print(f"Debt after 1 year: {debt_result}") if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者agon_isation
相关产品推荐
相关产品推荐

