内容大纲
一、内置方法__new__/__del__/__len__/__hash__/__eq__
二、序列化模块pickle和json
一、内置方法
1、__new__:构造方法
在执行__init__之前,类会调用ibject中的__new__方法创建一个对象空间
class Foo: def __init__(self): print('init') def __new__(cls, *args, **kwargs): print('new') return object.__new__(cls) f = Foo() 结果:init new
重要应用:单例模式
class Foo: __instance = None def __init__(self,name,age): self.name = name self.age = age self.lst = [name] def __new__(cls, *args, **kwargs): if cls.__instance is None: cls.__instance = object.__new__(cls) return cls.__instance obj1 = Foo('小明',23) obj2 = Foo('小红',24) print(obj1.name,obj1.age) # 小红 24 print(obj1.lst) # ['小红']
2、__del__:析构方法,当对象在内存中被释放的时候,会主动触发这个方法,当对象被删除的时候,会先触发这个方法在删除对象,这个方法通常用于关闭文件,归还系统资源等,到程序结束总会执行这个方法
class Foo: def __del__(self): print('执行我啦') obj = Foo() del obj print('结束') 结果:执行我啦 结束
3、__len__:可以使用len()函数计算对象的长度
class Class: def __init__(self,course): self.course = course self.student = [] def __len__(self): return len(self.student) python = Class('python') python.student.append('小明') python.student.append('小红') python.student.append('小黑') print(len(python)) # 3
4、__eq__:可根据eq中的条件判断两个对象是否相等
扫描二维码关注公众号,回复:
3167418 查看本文章
class Foo: def __init__(self,name,age): self.name = name self.age = age def __eq__(self, other): if self.name == other.name: return True else: return False obj1 = Foo('小明',23) obj2 = Foo('小红',23) obj3 = Foo('小明',24) print(obj1==obj2) # False print(obj1==obj3) # True
5、__hash__:根据自定义的条件计算对象的哈希值
class Foo: pass obj = Foo() print(hash(obj)) #-9223371856450203262 class Foo: def __hash__(self): return hash('foo') obj = Foo() print(hash(obj)) #-3494245336101080890
哈希算法的特点:
1、同一个程序中,相同的值的哈希值是相同的
2、同一个程序中,不同的值的哈希值总是不同的(也有一些例外)
字典寻址快的原因:首先计算键的hash值,得出内存地址,根据内存地址找到value
set的去重原理:① 首先计算元素的哈希值,得到内存地址
② 到这个内存地址上去看,如果没有值,就把这个值放到这个内存地址上;如果有值,判断两个值是否相等,相等的话就丢弃后一个值,不想等的话进行二次寻址找另一块内存去存这个值
例题:100个员工的去重,姓名和性别相同就是同一个员工
class Staff: def __init__(self,name,age,sex,department,): self.name = name self.age = age self.sex = sex self.department = department def __eq__(self, other): if self.name == other.name and self.sex == other.sex: return True def __hash__(self): return hash(self.name + self.sex) name_lst = ['小明','小红','小黑','小白'] lst = [] for i in range(100): name = name_lst[i%4] obj = Staff(name,i,'male','python') lst.append(obj) set1 = set(lst) for i in set1: print(i.name,i.age) #结果: 小明 0 小黑 2 小红 1 小白 3
二、序列化模块
1、pickle: