我知道我可以通过以下方式在python中进行简单的运算符重载。
假设重载'+‘运算符。
class A(object):
def __init__(self,value):
self.value = value
def __add__(self,other):
return self.value + other.value
a1 = A(10)
a2 = A(20)
print a1 + a2
但当我尝试执行以下操作时,它会失败,
a1 = A(10)
a2 = A(20)
a3 = A(30)
print a1 + a2 + a3
因为__add__
只接受2个参数。用n个操作数实现操作符重载的最佳解决方案是什么?
发布于 2016-09-15 22:10:05
这是失败的,因为a1 + a2
返回一个int
实例,并且它的__add__
被调用,该实例不支持与自定义类A
相加;您可以在__add__
中返回一个A
实例,以消除此特定操作的异常:
class A(object):
def __init__(self,value):
self.value = value
def __add__(self,other):
return type(self)(self.value + other.value)
现在,将它们添加到一起的行为符合预期:
>>> a1 = A(10)
>>> a2 = A(20)
>>> a3 = A(30)
>>> print(a1 + a2 + a3)
<__main__.A object at 0x7f2acd7d25c0>
>>> print((a1 + a2 + a3).value)
60
当然,这个类在其他操作中也存在同样的问题;您需要实现其他dunder来返回您的类的一个实例,否则您将在其他操作中遇到相同的结果。
如果您希望在print
这些对象时显示良好的结果,您还应该实现__str__
以在调用时返回值:
class A(object):
def __init__(self,value):
self.value = value
def __add__(self,other):
return A(self.value + other.value)
def __str__(self):
return "{}".format(self.value)
现在,打印具有您需要的效果:
>>> print(a1 + a2 + a3)
60
发布于 2016-09-15 22:10:21
问题是
a1 + a2 + a3
给了30 + a3
30是一个整型数,整型数不知道如何与A相加
您应该在__add__
函数中返回A的一个实例
https://stackoverflow.com/questions/39513191
复制相似问题