一.析构方法:__del__ :释放一个空间之前执行
用处:某对象借用了操作系统的资源,要通过析构方法归还回去 (垃圾回收机制)
操作系统资源:文件资源,网络资源
class A: def __del__(self): #析构方法,del A的对象,会自动触发这个方法 print('执行方法') a = A() del a #对象的删除 del print(a) #找不到a 会报错
#处理文件例子 class File: def __init__(self,file_path): self.f = open('file_path') self.name = 'alex' def read(self): self.f.read(1024) def __del__(self):#去归还/释放一些在创建对象的时候借用的一些资源 #del 对象的时候 程序员触发(主动) #python解释器的垃圾回收机制 回收这个对象所占的内存的时候 python自动触发的 self.f.close() f= File('文件名') f.read() #不管是主动还是被动,这个f对象总会被清理掉,被清理掉就触发__del__方法,触发这个方法就会归还操作系统 #的文件资源
注意:f.close 是释放操作系统打开的文件资源 del f 是释放python解释器的内存
二.item系列: 和对象使用[]访问值有关
用处:在一些内置模块中,有一些特殊的方法,要求对象必须实现__getitem__/__setitem__才能使用
class A: def __getitem__(self, item): return getattr(self,item) def __setitem__(self, key, value): setattr(self,key,value) def __delitem__(self,key): delattr(self,key) a = A() print(a.__dict__) a['k'] = 'v' print(a.__dict__) print(a['k']) del a['k'] print(a.__dict__) #结果: {} {'k': 'v'} v {}
三.__hash__/__sq__
hash方法:底层数据结构基于hash值寻址的优化操作,hash是一个算法,能够把某一个要存在内存里的
值通过一系列计算,保证不同值的hash结果是不一样的.
记住:对同一值多次执行python代码的时候hash值是不一样的
对同一值一次性执行python代码的时候hash值永远不变
ps:字典的key基于哈希算法,set集合去重机制也是基于hash算法
set集合去重机制:先通过哈希算法,取到一个空间,看里面有没有值,没有就填进去,有就在对值进行比较.不一样的话,进行二次寻址,,一样的话,覆盖.
hash(obj):obj内部必须实现__hash__方法
__eq__ ==这个语法是完全和__eq__相关的,__eq__返回的所有值都是当成布尔值来查看
class A: def __init__(self,name,age): self.name = name self.age = age a = A('张三',20) a1 = A('张三',20) print(a == a1)
#结果:Flase #判断的是内置地址所以为Flasd
class A: def __init__(self,name,age): self.name = name self.age = age def __eq__(self, other): #判断对象的值是否相等 if self.name == other.name and self.age == other.age: return True a = A('张三',20) a1 = A('张三',20) print(a==a1) #结果:True
一道面试题
一个类 # 对象的属性 : 姓名 性别 年龄 部门 # 员工管理系统 # 内部转岗 python开发 - go开发 # 姓名 性别 年龄 新的部门 # alex None 83 python # alex None 85 luffy 600个员工 # 如果几个员工对象的姓名和性别相同,这是一个人 # 请对这600个员工做去重 class Employee: def __init__(self,name,age,sex,partment): self.name = name self.age = age self.sex = sex self.partment = partment def __hash__(self): return hash('%s%s'%(self.name,self.sex)) def __eq__(self, other): if self.name == other.name and self.sex == other.sex: return True employ_lst = [] for i in range(200): employ_lst.append(Employee('alex',i,'male','python')) for i in range(200): employ_lst.append(Employee('wusir',i,'male','python')) for i in range(200): employ_lst.append(Employee('taibai', i, 'male', 'python')) # print(employ_lst) employ_set = set(employ_lst) for person in employ_set: print(person.__dict__)
set的去重机制:先调用hash,在调用eq,eq不是每次都触发,只有哈希值相等的时候才触发