在python中,是否可以像这样使用运算符重载添加三个实例变量s1+s2+s3


class user:
def __init__(self):
self.userid=int(input("Enter userid"))
self.balance=float(input("Enter a balance"))
def __add__(self,obj1,obj2):
self.Totalbalance = self.balance + obj1.balance + obj2.balance
print(self.Totalbalance)
def __add__(self,obj1):
u1,u2,u3=user(),user(),user()
u1+u2+u3  #printing the result

以下是它的外观,但这仍然是个坏主意。请注意,让通用类自己进行I/O是一个非常糟糕的主意。类应该封装数据并处理数据上的行为。I/O应由调用者负责。

class user:
def __init__(self,userid=None,balance=None):
self.userid=userid
self.balance=balance
def __add__(self,obj):
return user(self.userid,self.balance+obj.balance)

def newuser():
userid=int(input("Enter userid "))
balance=float(input("Enter a balance "))
return user(userid,balance)

u1,u2,u3=newuser(),newuser(),newuser()
print((u1+u2+u3).balance)

输出:

Enter userid 1
Enter a balance 2
Enter userid 3
Enter a balance 4
Enter userid 5
Enter a balance 6
12.0

备选方案

另一种方法是让user+user返回一个float,然后添加一个处理float+user的方法来进行链接。这有点好,但仍然很尴尬:

class user:
def __init__(self,userid=None,balance=None):
self.userid=userid
self.balance=balance
def __add__(self,obj):
return self.balance+obj.balance
def __radd__(self,obj):
if isinstance(obj,user):
return obj.balance+self.balance
if isinstance(obj,float):
return obj+self.balance

def newuser():
userid=int(input("Enter userid "))
balance=float(input("Enter a balance "))
return user(userid,balance)

u1,u2,u3=newuser(),newuser(),newuser()
print(u1+u2+u3)

这会产生相同的输出。

不完全是。__add__方法需要正好接受两个参数;当你打两次电话时,你基本上就是在做

u1.__add__(u2).__add__(u3)

此外,您的代码对结果没有任何作用。

没有什么可以阻止一个方法接受三个参数,但现有的运算符都接受一个(例如,一元减号(或两个参数,并且一般运算符的优先级决定了如何调用它们。

其他一些语言有三元运算符,例如C的x?y:z和许多其他语言(类似于Python中的y if x else z(;但是,为已经自然分解为两个二元算子的东西制作一个三元算子似乎是一个不必要的复杂问题。

最新更新