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</br>a -= b</br>a *= b</br>… a._iadd(b)</br>a.\isub(b)</br>a.\imul_(b)</br>…
+ 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运算符重载和特殊方法


All articles in this blog adopt the CC BY-SA 4.0 agreement unless otherwise stated. Please indicate the source for reprinting!