面向对象进阶(三)

一.析构方法
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'}