专栏名称: 隼与鱼
目录
相关文章推荐
51好读  ›  专栏  ›  隼与鱼

运算符重载(一)

隼与鱼  · 简书  ·  · 2019-03-23 08:26

正文

请到「今天看啥」查看全文


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







请到「今天看啥」查看全文