1 析构方法:(deal)释放一个空间
构造方法:申请一个空间new
析构方法:释放一个空间del
对象借用了操作系统的资源(文件资源,网络资源)还要通过equal方法还回去。
垃圾回收机制
代码块:垃圾回收机制
class A:
def __del__(self):
print('正在执行我')
a=A()
del a #之所以能执行del a 是因为在类中有__del__方法
print(a) #会报错。
文件的回收
代码块
class File():
def __init__(self,file_path):
self.f=open(file_path,encoding='utf-8')
self.name='wangsiyu'
def read(self):
res=self.f.read(1024)
print(res)
def __del__(self):
self.f.close()
f=File('文件')
f.read()
#不管是主动还是被动,这个f对象总会被清理掉,清理的时候就会出发__del__方法,
#出发这个方法,就会归还操作系统的一些资源。
2 item系列
代码块
dic={'name':'wangsiyu'}
print(dic) #{'name': 'wangsiyu'}
print(dic['name']) #wangsiyu
字典中的项为什么能删除,能修改,能查询,能增加?因为类中有对应的内置方法
代码块
class B:
#字典之所以能实现增删改查,是因为有内部的方法。
def __getitem__(self, item):
return getattr(self,item)
def __setitem__(self, key, value):
return setattr(self,key,value)
def __delitem__(self, key):
return delattr(self,key)
b=B()
b['name']='wangsiyu' #setattr
print(b['name']) #getattr
del b['name'] #delattr
print(b['name']) #已经删除了,会报错。
列表中的项为什么也能增删改查呢。
代码块
class B:
def __init__(self,lst):
self.lst = lst
def __getitem__(self, item):
return self.lst[item]
def __setitem__(self, key, value):
self.lst[key] = value
def __delitem__(self, key):
self.lst.pop(key)
b = B(['111','222','ccc','ddd'])
print(b.lst[0])
#
print(b[0])
#
b[3] = 'alex'
#
print(b.lst)
print(b)
del b[2]
#
print(b.lst)
3.hash算法
能够把某一个要存在内存里的值通过一系列计算, 保证不同值的hash结果是不一样的, 对同一个值在多次执行python代码的时候hash值是不同,但是对同一个值 在同一次执行python代码的时候hash值永远不变。hash(obj)#obj内部必须实现了hash方法
4 eq方法
代码块
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('alex',83)
aa = A('alex',83)
print(a==aa) #执行等号相当于调用对象所属于类中里面的__eq__方法
5 set的去重机制,先调用hash,再调用eq
代码块
# 一个类, 对象的属性 : 姓名 性别 年龄 部门,有个需求,# 90个员工有重复的员工,
# 规则是:如果几个员工对象的姓名和性别相同,就认定是同一个人
# 请对这90个员工做去重
class Info:
def __init__(self,name,gender,age,dept):
self.name=name
self.gender=gender
self.age=age
self.dept=dept
def __hash__(self):
return hash('%s%s'%(self.name,self.gender))
def __eq__(self, other):
if self.name == other.name and self.gender == other.gender:
return True
else:
return False
infolist=[]
for i in range(30):
infolist.append(Info('wangsiyu','male',i,'IT'))
for i in range(30):
infolist.append(Info('mayun','male',i,'IT'))
for i in range(30):
infolist.append(Info('maozidong', 'male', i, 'IT'))
# print(infolist)
info=set(infolist) #把列表转化为集合,这个过程会去重,去重就会调用__hash__方法和__eq__方法
for i in info:
print(i.__dict__)
![](https://img.haomeiwen.com/i10622766/31d818ce504871de.gif)
网友评论