Python提供了对运算符重载的特性
实践 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)
乘法运算符 使用*乘法运算符时,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)
取负运算符 使用-取负运算符时,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} ;" )
大于运算符 使用>大于运算符时,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} " )
参考文献
Python编程·第3版:从入门到实践 Eric Matthes著
Python基础教程·第3版 Magnus Lie Hetland著
流畅的Python·第1版 Luciano Ramalho著