【问题标题】:Python operator overloading with multiple operands具有多个操作数的 Python 运算符重载
【发布时间】:2016-09-15 14:05:25
【问题描述】:

我知道我可以通过以下方式在 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 个操作数实现运算符重载的最佳解决方案是什么。

【问题讨论】:

    标签: python python-2.7 python-3.x python-2.x


    【解决方案1】:

    这是失败的,因为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
    

    这个类当然会遇到与其他操作相同的问题;您需要实现其他 dunders 以返回您的类的实例,否则您将在其他操作中遇到相同的结果。

    如果你想在你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
    

    【讨论】:

    • 为什么暂时?对我来说似乎是正确的解决方案。
    • 暂时可能是一个错误的词,关键是这解决了特定操作的问题,但一般来说,如果您不实施所有必需的操作,您会得到奇怪的结果。
    • 谢谢。但我想通过只给出 a1 + a2 + a3 来获得结果,而不是在外部使用 value 属性。
    • 然后你重载__str__(可能还有__repr__)@karthi_ms 来返回结果:-)
    【解决方案2】:

    问题是

    a1 + a2 + a330 + a3

    30是一个int,int不知道怎么和A相加

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

    【讨论】:

      猜你喜欢
      • 2018-02-11
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多