今日内容大纲:
# __del__
# item系列
# __getitem__
# __setitem__
# __delitem__
# __hash__
# __eq__
# 一道面试题
# 模块
------------------------------------ __del__ (析构方法) --------------------------------------
构造方法: 申请一个空间
析构方法: 释放一个空间之间执行
某对象借用了操作系统的资源,还要通过析构方法归还回去 : 文件资源 网络资源
垃圾回收机制:
例题1-------------------
class A:
def __del__(self):
# 析构方法 del A的对象 会自动触发这个方法
print('执行我了')
a = A()
print(a)
例题2------------------------
# # 处理文件的
# 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()
在这个方法执行过程中,会自动执行__del__方法,为了释放空间.不管是主动还是被动,这个f对象总会被清理掉的,
被清理掉就触发__del__方法,触发这个方法就会归还操作系统的文件资源.
python解释器在内部就能搞定的事儿
申请一块空间,操作系统分配给你的
在这一块空间之内的所有事儿,归你的python解释器来管理
f = open("wenjian") # python -> 操作系统 --> 硬盘中的文件 --> 文件操作符
f.close()
------------------------------- item ---------------------------------
item系列 和对象使用[]访问值有联系
obj = {"k":"v"}
print(obj) #字典的对象
print(obj["k"])
在内置的模块中
有一些特殊的方法,要求对象必须实现 __getitem__/ __setitem__ 才能使用
# class B:
# def __getitem__(self, item):
# return getattr(self,item)
# def __setitem__(self, key, value):
# setattr(self,key,value*2)
# def __delitem__(self, key):
# delattr(self,key)
# b = B()
# # b.k2 = 'v2'
# # print(b.k2)
# b['k1'] = 'v1' # __setitem__
# print(b['k1']) # __getitem__
# del b['k1'] # __delitem__
# print(b['k1'])
--------------------------------- __eq__ ---------------------------------------------
class A:
def __init__(self,name,age):
self.name = name
self.age = age
def __eq__(self, other):
print("执行了__eq__方法")
if self.name == other.name and self.age == other.age:
return True
a = A('alex',83)
aa = A('alex',83)
aa2 = A('alex',83)
print(a,aa) #打印出 对象 a aa 的内存空间
print(aa == a) #默认会执行 父类 object 中的 __eq__ 方法, 在默认的 __eq__ 中比较的是,数值和内存地址是否都一致,
# 但是自己实现了 __eq__ 方法之后,可以对内部的代码进行修改.
------------------------------------------------ 一道面试题(员工信息去重) ---------------------------------
# 一个类
# 对象的属性 : 姓名 性别 年龄 部门
# 员工管理系统
# 内部转岗 python开发 - go开发
# 姓名 性别 年龄 新的部门
# alex None 83 python
# alex None 85 luffy
# 1000个员工
# 如果几个员工对象的姓名和性别相同,这是一个人
# 请对这1000个员工做去重
# 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) # 在使用集合去重的时候,会自动执行 __hash__ 方法, 如果hash值相等,会自动执行 __eq__ 来判断连个数值是否相等,如果相等的话就会去重.
# for person in employ_set: # 因为在列表中存储的是,每个实例化出来的对象的地址,所以可以根据对象的地址.__dict__ 得到每个对象内部存储的所有信息(姓名,年龄,性别,部门)
# print(person.__dict__)
-------------------------------------------------- 模块 --------------------------------------------
# 高阶面试题/读源码/简化操作
# 模块
# 模块的分类
# 内置模块
# 安装python解释器的时候跟着装上的那些方法
# 第三方模块/扩展模块
# 没在安装python解释器的时候安装的那些功能
# 自定义模块
# 你写的功能如果是一个通用的功能,那你就把它当做一个模块
# 什么是模块
# 有的功能开发者自己无法完成,这样的话需要借助已经实现的函数类来完成这些功能
# 你实现不了的功能都由别人替你实现了
# 操作系统打交道
# 和时间
# 1000取随机数
# 压缩一个文件
# 和网络通信
# 别人写好的一组功能 文件夹/py文件/C语言编译好的一些编译文件
# 分类 管理方法
# 节省内存
# 提供更多的功能
# 为什么要有模块?
# 分类 管理方法
# 节省内存
# 提供更多的功能
# 模块怎么用?在哪儿用?
---------------- 模块的创建和导入--------------
# import my_module # 要导入一个py文件的名字,但是不加.py后缀名
# import my_module # 模块的名字必须要满足变量的命名规范
# # 一般情况下 模块都是小写字母开头的名字
# # import这个语句相当于什么???
# # import这个模块相当于执行了这个模块所在的py文件
#
# # 模块可以被多次导入么? 一个模块不会被重复导入
#
# # 如何使用模块?
# def login():print('in mine login')
# name = '太亮'
# login()
# my_module.login()
# # print(my_module.name)
# 在导入一个模块的过程中到底发生了哪些事情
# 模块的重命名
# import my_module as m
# m.login()
# my_module.login()
# 导入多个模块
import os
import my_module
# PEP8规范
# 所有的模块导入都应该尽量放在这个文件的开头
# 模块的导入也是有顺序的
# 先导入内置模块
# 再导入第三方模块
# 最后导入自定义模块