运算符重载
运算符重载指的是将运算符与类方法关联起来,每个运算符对应一个指定的内置方法。
Python通过重写一些内置方法,实现了运算符的重载功能。
operator模块提供以下的特殊方法,可以将类的实例使用下面的操作符来操作
运算符重载示例:
class Person:
def __init__(self,name,age=18):
self.name = name
self.age = age
#
#加减运算符
def __sub__(self, other):
return self.age - other.age
def __add__(self, other):
return self.age + other.age
# #
# def __isub__(self, other):
# print('-=')
# # return Person(self.name,self.age - other.age)
# self.age = self.age - other.age #就地修改
# return self
# 比较运算符
def __eq__(self, other): #比较运算符
return self.age == other.age
def __gt__(self, other):
return self.age > other.age
#
# #
# tom = Person('tom')
# jerry = Person('jerry',age=16)
# # print(tom - jerry)
# # print(tom.__sub__(jerry)) #=====>tom实例调用sub方法,相当于self,jerry相当于other
#
# # jerry -= tom
# # jerry = jerry - tom
# wan = jerry + tom
# # print(jerry)
# print(wan)
#
tom = Person('tom')
jerry = Person('jerry',age=16)
# print(tom > jerry)
# print(tom < jerry)
# print(tom >= jerry) #执行失败 需要用 >= 方法 __ge__
# print(tom <= jerry) #执行失败
print(tom == jerry)
print(tom != jerry)
@functools.total_ordering装饰器
作用:比较大小实现的方法,可以使用该装饰器简化代码。
注意:要求__eq__必须实现,其他实现其一`
from functools import total_ordering
@total_ordering
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def __eq__(self, other):
return self.age == other.age
def __gt__(self, other):
return self.age > other.age
tom = Person('tom', 20)
jerry = Person('jerry', 16)
print(tom > jerry)
print(tom < jerry)
print(tom >= jerry)
print(tom <= jerry)
@functools.total_ordering装饰器弊端:可能带来性能问题,一般来说比较实现等于或小于方法就够了,其他可以不实现,此装饰器使用占用资源,不推荐使用。
容器相关方法
len:内建函数len(),返回对象的长度(>=0的整数),如果把对象当作容器类型,如:list或dict
bool()函数调用时,如果没有__bool__()方法,则会看__len__方法是否存在,非0为真。
iter:迭代容器时,调用,返回一个新的迭代器对象
contains:in成员运算符,若没有实现,则调用__iter__方法遍历
getitem:实现self[key]访问。序列对象,用于索引、切片操作,在对象执行索引、切片或者 for 迭代操作时,会自动调用该方法。对于set和dict,key为hashable,key不存在引发keyError异常。
setitem:和 getitem__访问类似,设置值的方法。索引赋值,在通过赋值语句给索引或者切片赋值时,可调用__setitem()方法实现对序列对象的修改。
delitem()方法:当使用 del 关键字删除对象时,实质上会调用__delitem__()方法实现删除操作。
missing:字典或其子类使用 getitem()调用时,key不存在执行该方法。
#__missing__方法实现
# class A(dict):
# def __missing__(self, key):
# print('miss key',key)
# return 0
# a = A()
# print(a['k'])
# __getitem__()方法、__setitem__()方法、__delitem__()方法的实现
class SelectData:
def __init__(self,data):
self.data = data[:]
# def __getitem__(self, index): #index相当于key
# return self.data[index]
#
# def __setitem__(self, index, value):
# self.data[index] = value
#
# def __delitem__(self, index):
# del self.data[index]
#
# # def __missing__(self, key): #字典或其子类使用 __getitem__()调用时,key不存在执行该方法 不适用于list
# # return 0
def __iter__(self):
return iter(self.data) #内建函数封装成一个迭代器返回
#
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的元素
# print(x[:])
# print(x[10]) #missing方法之用于字典
for num in x: #历对象x中的元素遍
print(num,end="")
print('___________________')
print(33 in x) #in成员运算符,若没有实现__contains__,则调用__iter__方法遍历