在Python中可通过运算符重载来实现对象之间的运算,如字符串可以进行如下运算:
'www.jianshu' + '.com'
字符串可以通过
+
运算符实现字符串连接操作,其本质是通过
add
方法重载了运算符
+
,因此上述代码还可以写成如下代码:
'www.jianshu'.__add__('.com')
Python把运算符与类的实例方法关联起来,每个运算符都对应一个方法。运算符重载就是让类的实例对象可以参与内置类型的运算,下表列出了部分运算符重载方法。
运算符
|
方法
|
说明
|
示例(a、b均为对象)
|
+
|
add
(self, other)
|
加法
|
a + b
|
-
|
sub
(self, other)
|
减法
|
a - b
|
*
|
mul
(self, other)
|
乘法
|
a * b
|
/
|
truediv
(self, other)
|
除法
|
a / b
|
%
|
mod
(self, other)
|
求余
|
a % b
|
<
|
lt
(self, other)
|
小于
|
a < b
|
<=
|
le
(self, other)
|
小于等于
|
a <= b
|
>
|
gt
(self, other)
|
大于
|
a > b
|
>=
|
ge
(self, other)
|
大于等于
|
a >= b
|
==
|
eq
(self, other)
|
等于
|
a == b
|
!=
|
ne
(self, other)
|
不等于
|
a != b
|
[index]
|
getitem
(self, item)
|
下标运算符
|
a[0]
|
in
|
contains
(self, item)
|
检查是否是成员
|
r in a
|
len
|
len
(self)
|
元素个数
|
len(a)
|
str
|
str
(self)
|
字符串表示
|
str(a)、print(a)
|
算术运算符重载
定义一个复数类并对其进行算术运算符重载,如下所示。
1 class MyComplex: # 定义复数类
2 def __init__(self, r = 0, i = 0): # 构造方法
3 self.r = r # 实部
4 self.i = i # 虚部
5 def __add__(self, other): # 重载加运算
6 return MyComplex(self.r + other.r, self.i + other.i)
7 def __sub__(self, other): # 重载减运算
8 return MyComplex(self.r - other.r, self.i - other.i)
9 def __mul__(self, other): # 重载乘运算
10 return MyComplex(self.r*other.r - self.i*other.i,
11 self.i*other.r + self.r*other.i)
12 def __truediv__(self, other): # 重载除运算
13 return MyComplex(
14 (self.r*other.r + self.i*other.i)/(other.r**2 + other.i**2),
15 (self.i*other.r - self.r*other.i)/(other.r**2 + other.i**2))
16 def show(self): # 显示复数
17 if self.i < 0:
18 print('(', self.r, self.i, 'j)', sep = '')
19 else:
20 print('(', self.r, '+', self.i, 'j)', sep = '')
21 c1 = MyComplex(6, -8)
22 c2 = MyComplex(3, 4)
23 (c1 + c2).show()
24 (c1 - c2).show()
25 (c1 * c2).show()
26 (c1 / c2).show()
运行结果如下图所示。
在上例中,定义一个MyComplex类,通过
add
()、
sub
()、
mul
()、
truediv
()方法分别重载+、-、*、/运算符。
比较运算符重载
定义一个复数类并对其进行比较运算符重载,如下所示。
1 class MyComplex: # 定义复数类
2 def __init__(self, r = 0, i = 0): # 构造方法
3 self.r = r # 实部
4 self.i = i # 虚部
5 def __eq__(self, other): # 重载==运算符
6 return self.r == other.r and self.i == other.i
7 c1 = MyComplex(6, -8)
8 c2 = MyComplex(6, -8)
9 print(c1 == c2)
10 print(c1 != c2)
运行结果如下图所示。
在上例中,定义一个MyComplex类,通过
eq
()方法重载==运算符。