运算符重载指的是将运算符与类方法关联起来,每个运算符对应一个指定的内置方法。
Python通过重写一些内置方法,实现了运算符的重载功能。
1.加法运算符重载和减法运算符重载
- 加法运算符重载——
__add__()
方法 - 减法运算符重载——
__sub__()
方法
例 7-16 加法运算符重载和减法运算符重载的实现:
#ex0716.py 加法运算符重载和减法运算符重载的实现
class Computing:
def __init__(self,value):
self.value = value
def __add__(self, other):
lst = []
for i in self.value:
lst.append(i+other)#在列表末尾添加新的对象
return lst
def __sub__(self, other):
lst = []
for i in self.value:
lst.append(i-other)
return lst
c = Computing([-1,3,4,5])
print("+运算符重载后的列表",c+2)
print("-运算符重载后的列表",c-2)
运行结果:
2.__str__()
方法重载和__ge__()
方法重载
- 重载
__str__()
和__repr__()
方法可以将对象转换为字符串的形式,在执行print()、str()、repr()
等方法以及交互模式下直接打印对象时,会调用__str__()
和__repr__()
方法。__str__()
和__repr__()
方法的区别是,只有print()、str()
方法可以调用__str__()
方法转换,而__repr__()
方法在多种操作下都能将对象转换为自定义的字符串形式。 __ge__()
方法用于重载>=运算符
例 7-17 __str__()
方法重载和 __ge__()
方法重载的实现
#ex0717.py __str__()方法重载和 __ge__()方法重载的实现
class Student:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self): #重载__str__()
return "{}{}".format(self.name,self.age)
def __ge__(self, obj): #重载__ge__()
if self.age >= obj.age:
return True
return False
s1 = Student("Rose",20)
s2 = Student("John",19)
print("学生s1:",s1)
print("学生s2:",s2)
print("s1 >= s2 大小比较结果:",s1 >= s2)
运行结果:
3.索引的切片重载
__getitem__()
方法
用于索引、切片操作,在对象执行索引、切片或者 for 迭代操作时,会自动调用该方法。__setitem__()
方法
索引赋值,在通过赋值语句给索引或者切片赋值时,可调用__setitem__()
方法实现对序列对象的修改。__delitem__()
方法
当使用 del 关键字删除对象时,实质上会调用__delitem__()
方法实现删除操作。
例 7-18 __getitem__()
方法、__setitem__()
方法、__delitem__()
方法的实现:
#ex0718.py __getitem__()方法、__setitem__()方法、__delitem__()方法的实现
class SelectData:
def __init__(self,data):
self.data = data[:]
def __getitem__(self, index):
return self.data[index]
def __setitem__(self, index, value):
self.data[index] = value
def __delitem__(self, index):
del self.data[index]
#在下面测试
x = SelectData([12,33,23,"ab",False])
print(x) #x的地址
print(x[:]) #切片,x中的全部元素
print(x[2]) #切片,x中的下标为2元素
print(x[2:]) #切片,x中从下标为2起的所有元素
x[4] = 100 #索引赋值,替换x中的下标为4的元素
print(x[:])
del(x[3]) #删除x中的下标为3的元素
for num in x: #遍历对象x中的元素
print(num,end="")
运行结果: