Python:运算符重载特定类型

时间:2010-07-06 17:29:56

标签: python operator-overloading

我希望能够让我的类的运算符以我定义的方式与常规类型进行交互。让我们说,例如,我有:

class Mynum(object):
  def __init__(self, x):
   self.x = x
  def __add__(self, other):
   return self.x + other.x

a = Mynum(1)
b = Mynum(2)

print a+b

这很好用,但现在如果我尝试做的话:

print a+2

我收到错误,因为int没有名为x的成员。如何在课程中定义Mynum + int?这听起来像是装饰者或元类的工作,但我对他们的用法非常不熟悉。 This question似乎相似但不完全相同。

3 个答案:

答案 0 :(得分:13)

def __add__(self, other):
    if isinstance(other, self.__class__):
        return self.x + other.x
    elif isinstance(other, int):
        return self.x + other
    else:
        raise TypeError("unsupported operand type(s) for +: '{}' and '{}'").format(self.__class__, type(other))

答案 1 :(得分:4)

class Mynum(object):
    def __init__(self, x):
        self.x = x
    def __add__(self, other):
        try:
            return self.x + other.x
        except AttributeError:
            return self.x + other
    __radd__=__add__

a = Mynum(1)
b = Mynum(2)

print(a+b)
# 3
print(a+2)
# 3
print(2+a)
# 3

答案 2 :(得分:2)

为什么要使用额外的切换和/或异常处理?使用以下方法将是一种更简单的方法:

class MyNum(object):
    def __init__(self, x):
        self.x = x
    def __add__(self, other):
        return other + self.x
    __radd__ = __add__
x = MyNum(5)
y = MyNum(6)
print x + 2
7
print 2 + x
7
print x + y
11
print y + x
11