首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有多个操作数的Python运算符重载

具有多个操作数的Python运算符重载
EN

Stack Overflow用户
提问于 2016-09-15 22:05:25
回答 2查看 1K关注 0票数 1

我知道我可以通过以下方式在python中进行简单的运算符重载。

假设重载'+‘运算符。

代码语言:javascript
运行
复制
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

但当我尝试执行以下操作时,它会失败,

代码语言:javascript
运行
复制
a1 = A(10)
a2 = A(20)
a3 = A(30)
print a1 + a2 + a3

因为__add__只接受2个参数。用n个操作数实现操作符重载的最佳解决方案是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-15 22:10:05

这是失败的,因为a1 + a2返回一个int实例,并且它的__add__被调用,该实例不支持与自定义类A相加;您可以在__add__中返回一个A实例,以消除此特定操作的异常:

代码语言:javascript
运行
复制
class A(object):
  def __init__(self,value):
    self.value = value

  def __add__(self,other):
    return type(self)(self.value + other.value)

现在,将它们添加到一起的行为符合预期:

代码语言:javascript
运行
复制
>>> 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__以在调用时返回值:

代码语言:javascript
运行
复制
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)

现在,打印具有您需要的效果:

代码语言:javascript
运行
复制
>>> print(a1 + a2 + a3)
60
票数 3
EN

Stack Overflow用户

发布于 2016-09-15 22:10:21

问题是

a1 + a2 + a3给了30 + a3

30是一个整型数,整型数不知道如何与A相加

您应该在__add__函数中返回A的一个实例

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39513191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档