Python学习笔记-Day22-内置方法及序列化模块

内容大纲

一、内置方法__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中的条件判断两个对象是否相等

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:

猜你喜欢

转载自www.cnblogs.com/tian-tian/p/9640925.html