在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 ()方法重载==运算符。
………………………………