Python Calculator类调用sum方法报类型错误及减法除法运算顺序问题
报错根源
你遇到的unsupported operand type(s) for +: 'int' and 'Calculator'错误,核心是实例方法的参数定义错误:
Python 类的实例方法默认第一个参数会接收当前实例对象本身,你之前定义sum方法时写的是def sum(*args),调用t.sum()时,Python会自动把t这个Calculator实例作为第一个参数传入args,导致循环时出现整数 + Calculator实例的非法运算。
修正后完整实现
基础求和、乘法方法
按照规范给实例方法加self参数,遍历实例存储的参数:
class Calculator(object): def __init__(self, *args): self.args = args def sum(self): result = 0 for arg in self.args: result += arg return result def mul(self): result = 1 for arg in self.args: result *= arg return result
减法、除法逻辑修正
你之前的减法、除法结果顺序颠倒,是因为初始值设置和遍历逻辑完全反了:
你之前写的减法实现
result = 0后循环执行result = arg - result,对应参数(3,4)的运算过程是:3 - 0 = 3→4 - 3 = 1,自然输出颠倒后的结果。
- 减法、除法属于左结合运算,必须以第一个传入的参数为初始值,再依次对后续参数做运算,才符合用户的参数顺序预期
- 之前从0开始反向用参数减/除结果的写法,会把运算顺序变成逆序,自然得到颠倒的结果
修正后的减法、除法方法:
def subtract(self): if not self.args: raise ValueError("减法运算至少需要传入1个参数") # 初始值取第一个参数 result = self.args[0] # 从第二个参数开始遍历做减法 for arg in self.args[1:]: result -= arg return result def divide(self): if not self.args: raise ValueError("除法运算至少需要传入1个参数") result = self.args[0] for arg in self.args[1:]: if arg == 0: raise ZeroDivisionError("除数不能为0") result /= arg return result
测试验证
t = Calculator(3,4) print(t.sum()) # 输出7 print(t.mul()) # 输出12 print(t.subtract()) # 输出-1(3-4,符合预期) print(t.divide()) # 输出0.75(3/4,符合预期) # 多参数场景测试 t2 = Calculator(10, 5, 2) print(t2.subtract()) # 输出3(10-5-2) print(t2.divide()) # 输出1.0(10/5/2)
内容的提问来源于stack exchange,提问作者Casper
相关产品推荐
相关产品推荐

