Python 类中的一些 运算符 methods 的重载
看一个例子:
[Copy to clipboard] [ - ]
CODE:
>>> class A():
... def __init__(self, n):
... self.data = n
... def __add__(self, i):
... return self.data + i
...
>>> a1 = A(1)
>>> a2 = A(2)
>>> a1 + 2
3
>>> 2 + a2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'instance'
>>> a1 + a2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in __add__
TypeError: unsupported operand type(s) for +: 'int' and 'instance'
>>> class A():
... def __init__(self, n):
... self.data = n
... def __add__(self, i):
... return self.data + i
... def __radd__(self, i):
... return self.data +i
...
>>> a1 = A(1)
>>> a2 = A(2)
>>> a1 + a2
3
>>>
有以上可以看出:类中两元运算符是有方向性的
‘+’ 运算符:
__add__ method 是 左结合
__radd__ method 是 右结合
当左结合和右结合都定义时,才能实现类的两个对象运用 '+' 来计算
a1 + 2
此表达式计算时:a1 调用 '__add__' method
2 + a2
此表达式计算时:a2 调用 '__radd__' method
a1 + a2
此表达式计算时:a1 调用 '__add__' method,a2 调用 '__radd__' method
类似的运算符有:
[Copy to clipboard] [ - ]
CODE:
与:& __and__, __rand__
或:| __or__, __ror__
异或:^ __xor__, __rxor__
加:+ __add__, __radd__
减:- __sub__, __rsub__
乘:* __mul__, __rmul__
除:/ __div__, __rdiv__
整除:// __floordiv__, __rfloordiv__
右移:>> __rshift__, __rrshift__
左移:<< __lshift__, __rlshift__
...