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

Python中能否通过运算符重载实现s1+s2+s3形式的三实例相加?

Python中实现多实例连续相加的运算符重载方法

当然可以实现!但你写的代码存在几个关键问题,导致无法正常运行:

  • Python里__add__是二元运算符的重载方法,只能接受self和other两个参数,因为+本质是两个对象的运算。连续相加u1+u2+u3会被Python拆解成(u1+u2)+u3,分步执行。
  • 你定义了两个__add__方法,Python会直接覆盖前一个,只保留最后那个空实现的方法,运行时必然报错。
  • __add__方法需要返回一个可继续参与运算的结果(要么是数值,要么是同类实例),而不是直接修改self或打印。

正确实现方式1:直接返回余额总和

这种方式适合只需要计算总余额的场景:

class User:
    def __init__(self):
        self.userid = int(input("Enter userid: "))
        self.balance = float(input("Enter balance: "))
    
    def __add__(self, other):
        # 返回两个实例的余额之和,前一次相加的结果(数值)可以直接和下一个实例的balance相加
        return self.balance + other.balance

u1, u2, u3 = User(), User(), User()
total_balance = u1 + u2 + u3
print(total_balance)

正确实现方式2:返回新的类实例(更符合面向对象逻辑)

如果需要保留实例结构,让连续相加的结果仍是User实例,可以这么写:

class User:
    def __init__(self, userid=0, balance=0.0):
        # 新增带参数的初始化逻辑,方便创建计算后的实例
        if userid == 0 and balance == 0.0:
            self.userid = int(input("Enter userid: "))
            self.balance = float(input("Enter balance: "))
        else:
            self.userid = userid
            self.balance = balance
    
    def __add__(self, other):
        # 返回一个新的User实例,余额为两者之和,userid可设为标识值
        return User(userid=0, balance=self.balance + other.balance)
    
    def __repr__(self):
        # 自定义实例打印格式,方便查看结果
        return f"User(userid={self.userid}, total_balance={self.balance})"

u1, u2, u3 = User(), User(), User()
total_user = u1 + u2 + u3
print(total_user.balance)
# 或者直接打印实例
print(total_user)

运行原理

u1+u2+u3会被Python解析为(u1+u2)+u3:

  1. 先执行u1+u2,调用u1的__add__方法,返回一个新的User实例(或数值);
  2. 再用这个结果和u3相加,再次调用__add__方法,最终得到三个实例余额的总和。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:45:44