Python运算符重载和特殊方法

  • 数据结构与算法 [面向对象编程]

  • 操作系统: Windows 10
  • Anaconda 2019.3 Python 3.7.1

概念

Python的内置类为许多操作提供了自然的语义。比如,a + b 语句可以调用数值类型语句,也可以连续序列类型。
但是对于新的类来说,“+” 操作符是未定义的,所以就需要 操作符重载 (Operator Overloading) 技术来定义它

特殊方法实现的重载操作

常见的语法 特别方法的形式
a + b a.__add__(b) 或者 b.__radd__(a)
a - b a.__sub__(b) 或者 b.__rsub__(a)
a * b a.__mul__(b) 或者 b.__rmul__(a)
a / b a.__truediv__(b) 或者 b.__rtruediv__(a)
a // b a.__floordiv__(b) 或者 b.__rfloordiv__(a)
a % b a.__mod__(b) 或者 b.__rmod__(a)
a ** b a.__pow__(b) 或者 b.__rpow__(a)
a << b a.__lshift__(b) 或者 b.__rlshift__(a)
a >> b a.__rshift__(b) 或者 b.__rrshift__(a)
a & b a.__and__(b) 或者 b.__rand__(a)
a ^ b a.__xor__(b) 或者 b.__rxor__(a)
a | b a.__or__(b) 或者 b.__ror__(a)
a += b
a -= b
a *= b
a.__iadd__(b)
a.__isub__(b)
a.__imul__(b)
+ a a.__pos__(b)
- a a.__neg__(b)
~ a a.__invert__(b)
abs(a) a.__abs__(b)
a < b a.__lt__(b)
a <= b a.__le__(b)
a > b a.__gt__(b)
a >= b a.__ge__(b)
a == b a.__eq__(b)
a != b a.__ne__(b)
vin a a.__contains__(v)
a [k] a.__getitem__(k)
a [k] = v a.__setitem__(k,v)
del a [k] a.__delitem__(k)
a(arg1, arg2, ···) a.__call__(arg1, arg2, ···)
len(a) a.__len__()
hash(a) a.__hash__()
iter(a) a.__iter__()
next(a) a.__next__()
bool(a) a.__bool__()
float(a) a.__float__()
int(a) a.__int__()
repr(a) a.__repr__()
reversed(a) a.__reversed__()
str(a) a.__str__()

演示实例

我们创建一个 Vector 的多维向量类的实现方法,代表了多维空间中的向量的坐标,如坐标<5, -2, 3>相加坐标<1, 4, 2>的结果是使用列表进行计算得到<5, -2, 3, 1, 4, 2>, 我们现在将使用运算符重载来实现我们的需求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class Vector:
"""表示多维数据集里的向量"""

def __init__(self, d):
"""创建D维度向量"""
self.__coords = [0] * d

def __len__(self):
"""返回向量维数"""
return len(self.__coords)

def __getitem__(self, j):
"""返回下标j的向量"""
return self.__coords[j]

def __setitem__(self, j, val):
"""设置下标j的向量值"""
self.__coords[j] = val

def __add__(self, other):
"""返回向量计算和"""
if len(self) != len(other):
raise ValueError('维度必须一致')
result = Vector(len(self))
for j in range(len(self)):
result[j] = self[j] + other[j]
return result

def __eq__(self, other):
"""返回坐标是否相同"""
return self.__coords == other.__coords

def __ne__(self, other):
"""返回坐标是否不同"""
return not self == other

def __str__(self):
"""生成表示向量的字符"""
return '<' + str(self.__coords)[1: -1] + ">"


if __name__ == '__main__':
v = Vector(5)
v[1] = 23 # <0, 23, 0, 0, 0>
v[-1] = 45 # <0,23, 0, 0, 45>
print(v[4])
u = v + v # <0, 46, 0, 0, 90>
total = 0
for entry in v:
total += entry

Demo on Github : Python运算符重载和特殊方法