一.析构方法
1.执行时间
构造方法 : 申请一个空间
析构方法 : 释放一个空间以前执行
某对象借用了系统的资源还要经过析构方法还回去: 文件资源 , 网络资源
2.垃圾回收机制python
class A: def __del__(self): # 析构方法 del A的对象会自动弄触发这个方法 print("执行了析构方法") a = A() del a 执行了析构方法 # 垃圾回收机制,系统会自动释放空间 class A: def __del__(self): # 析构方法 del A的对象会自动弄触发这个方法 print("执行了析构方法") a = A() # del a 执行了析构方法 # 在释放空间前,归还/释放一些以前借用的资源 class File: # 处理文件 def __init__(self, file_path): self.f = open(file_path,"r",encoding="utf-8") self.name = "小明" def read(self): return self.f.read(20) def __del__(self): self.f.close() # 手动关闭句柄,python解释器的垃圾回收机制只能自动删除获取的句柄的内存空间(只能删钥匙不能关门) f = File("count.py") f.read()
二.item系列
1.和对象使用[ ] 访问值有联系
2.getitem, setitem ,delitem.算法
class B: def __getitem__(self, item): print("执行getitem") return getattr(self, item) def __setitem__(self, key, value): print("执行setitem") return setattr(self, key, value) def __delitem__(self, key): print("执行delitem") return delattr(self, key) b = B() b["k1"] = 'v1' # 结果 : 执行setitem print(b["k1"]) # 结果 : 执行getitem # v1 del b["k1"] # 结果 : 执行delitem
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] = '小明' print(b.lst) del b[2] print(b.lst) 111 111 ['111', '222', 'ccc', '小明'] ['111', '222', '小明']
四.__hash__和__eq__方法
1.hash是一个算法,可以某一个要存在内存中的值经过一系列计算(保证不一样的值hash结果是不一样的),对一个值在屡次执行Python代码时hash值是不一样的,到时对于一个值在同义词执行Python代码时hash值永远不变.底层数据结构就是基于hash值寻址优化操做.
2.set集合.网络
# set集合 se = {1, 2, 2, 3, 4, 5, 'a', 'b', 'd', 'f'} print(se) {1, 2, 3, 4, 5, 'a', 'd', 'b', 'f'}
首先调用hash计算hash值,其存入对应地址,若地址中已经有值,执行eq操做(==)判断值是否相等,相等就覆盖.数据结构
# 一个类 # 对象的属性 : 姓名 性别 年龄 部门 # 员工管理系统 # 内部转岗 python开发 - go开发 # 姓名 性别 年龄 新的部门 # alex None 83 python # alex None 85 luffy # 1000个员工 # 若是几个员工对象的姓名和性别相同,这是一我的 # 请对这1000个员工作去重 class Employee: def __init__(self, name, gender, age, department): self.name = name self.gender = gender self.age = age self.department = department 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 employee_list = [] for i in range(6): employee_list.append(Employee("小明", "男", 23, "python")) for i in range(7): employee_list.append(Employee("老李", "男", 40, "产品经理")) for i in range(5): employee_list.append(Employee("赵铁柱", "男", 26, "打水的")) employee_set = set(employee_list) # set 会先执行hash计算hash值,此时执行__hash__,返回了咱们想进行筛选的hash值(根据name和gender相同) # 哈希值相同时会进行eq判断,此时会执行__eq__,若是name和gender值相同就返回True,此时会进行覆盖,达到去重效果 for emp in employee_set: print(emp.__dict__) {'name': '老李', 'gender': '男', 'age': 40, 'department': '产品经理'} {'name': '赵铁柱', 'gender': '男', 'age': 26, 'department': '打水的'} {'name': '小明', 'gender': '男', 'age': 23, 'department': 'python'}