0%

Python之运算符重载

Python提供了对运算符重载的特性

abstract.png

实践

Python中的每个运算符都有对应的方法,可在自定义类中重新实现相应的方法,实现改变运算符的行为。这里对常见运算符进行重载

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

class MyVector:
"""
二维向量
"""

def __init__(self, x=0, y=0):
self.x = x
self.y = y

def __str__(self):
return f"[My Vector] x:{self.x}, y:{self.y}"

def __add__(self, other):
x = self.x + other.x
y = self.y + other.y
return MyVector(x,y)

def __mul__(self, num):
x = self.x * num
y = self.y * num
return MyVector(x,y)

def __neg__(self):
return MyVector(-1*self.x, -1*self.y)

def __gt__(self, other):
self_sum = self.x + self.y
other_sum = other.x + other.y
if( self_sum > other_sum ) :
return True
else:
return False

加法运算符

使用+加法运算符时,Python会自动调用自定义对象的__add__()方法

1
2
3
4
5
6
7
print("重载+加法运算符")
my_vector3 = MyVector(1,2)
my_vector4 = MyVector(5,7)
my_vector5 = my_vector3 + my_vector4
print("my_vector3: ", my_vector3)
print("my_vector4: ", my_vector4)
print("my_vector3 + my_vector4: ", my_vector5)

figure 1.png

乘法运算符

使用*乘法运算符时,Python会自动调用自定义对象的__mul__()方法

1
2
3
4
5
print("重载*乘法运算符")
my_vector6 = MyVector(3,7)
my_vector7 = my_vector6 * 2
print("my_vector6: ", my_vector6)
print("my_vector6 * 2: ", my_vector7)

figure 2.png

取负运算符

使用-取负运算符时,Python会自动调用自定义对象的__neg__()方法

1
2
3
4
5
6
7
print("重载-取负运算符")
my_vector1a = MyVector(11,22)
my_vector1b = -my_vector1a
my_vector2a = MyVector(33,-44)
my_vector2b = -my_vector2a
print(f"my_vector1a -->> {my_vector1a}, my_vector1b -->> {my_vector1b};")
print(f"my_vector2a -->> {my_vector2a}, my_vector2b -->> {my_vector2b};")

figure 3.png

大于运算符

使用>大于运算符时,Python会自动调用自定义对象的__gt__()方法

1
2
3
4
print("重载大于运算符")
my_vector8 = MyVector(111,222)
my_vector9 = MyVector(1,2)
print(f"my_vector8 > my_vector9 : {my_vector8 > my_vector9}")

figure 4.png

参考文献

  1. Python编程·第3版:从入门到实践 Eric Matthes著
  2. Python基础教程·第3版 Magnus Lie Hetland著
  3. 流畅的Python·第1版 Luciano Ramalho著
请我喝杯咖啡捏~

欢迎关注我的微信公众号:青灯抽丝