美文网首页
【第35天】python全栈从入门到放弃

【第35天】python全栈从入门到放弃

作者: 36140820cbfd | 来源:发表于2019-08-28 10:48 被阅读0次

    1 析构方法:(deal)释放一个空间

    构造方法:申请一个空间new

    析构方法:释放一个空间del

    对象借用了操作系统的资源(文件资源,网络资源)还要通过equal方法还回去。

    垃圾回收机制

    代码块:垃圾回收机制
    class A:
        def __del__(self):
            print('正在执行我')
    
    a=A()
    del a    #之所以能执行del a 是因为在类中有__del__方法
    print(a)   #会报错。
    

    文件的回收

    代码块
    class File():
        def __init__(self,file_path):
            self.f=open(file_path,encoding='utf-8')
            self.name='wangsiyu'
    
        def read(self):
            res=self.f.read(1024)
            print(res)
    
        def __del__(self):
            self.f.close()
    
    f=File('文件')
    f.read()
    #不管是主动还是被动,这个f对象总会被清理掉,清理的时候就会出发__del__方法,
    #出发这个方法,就会归还操作系统的一些资源。
    

    2 item系列

    代码块
    dic={'name':'wangsiyu'}
    print(dic)   #{'name': 'wangsiyu'}
    print(dic['name'])    #wangsiyu
    

    字典中的项为什么能删除,能修改,能查询,能增加?因为类中有对应的内置方法

    代码块
    class B:
    
        #字典之所以能实现增删改查,是因为有内部的方法。
    
        def __getitem__(self, item):
            return getattr(self,item)
    
        def __setitem__(self, key, value):
            return setattr(self,key,value)
    
        def __delitem__(self, key):
            return  delattr(self,key)
    
    b=B()
    b['name']='wangsiyu'   #setattr
    print(b['name'])     #getattr
    del b['name']    #delattr
    print(b['name'])   #已经删除了,会报错。
    

    列表中的项为什么也能增删改查呢。

    代码块
    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] = 'alex'
    #
    print(b.lst)
    print(b)
    del b[2]
    #
    print(b.lst)
    
    

    3.hash算法

    能够把某一个要存在内存里的值通过一系列计算, 保证不同值的hash结果是不一样的, 对同一个值在多次执行python代码的时候hash值是不同,但是对同一个值 在同一次执行python代码的时候hash值永远不变。hash(obj)#obj内部必须实现了hash方法

    4 eq方法

    代码块
    class A:
    
        def __init__(self,name,age):
    
            self.name = name
    
            self.age = age
    
        def __eq__(self, other):
    
            if self.name == other.name and self.age == other.age:
    
                return True
    
    a = A('alex',83)
    
    aa = A('alex',83)
    
    print(a==aa)   #执行等号相当于调用对象所属于类中里面的__eq__方法
    

    5 set的去重机制,先调用hash,再调用eq

    代码块
    # 一个类, 对象的属性 : 姓名 性别 年龄 部门,有个需求,# 90个员工有重复的员工,
    # 规则是:如果几个员工对象的姓名和性别相同,就认定是同一个人
    # 请对这90个员工做去重
    
    class Info:
    
        def __init__(self,name,gender,age,dept):
    
            self.name=name
    
            self.gender=gender
    
            self.age=age
    
            self.dept=dept
    
        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
    
            else:
    
                return  False
    
    infolist=[]
    
    for i in range(30):
    
        infolist.append(Info('wangsiyu','male',i,'IT'))
    
    for i in range(30):
    
        infolist.append(Info('mayun','male',i,'IT'))
    
    for i in range(30):
    
        infolist.append(Info('maozidong', 'male', i, 'IT'))
    
    # print(infolist)
    
    info=set(infolist)   #把列表转化为集合,这个过程会去重,去重就会调用__hash__方法和__eq__方法
    
    for i in info:
    
        print(i.__dict__)
    
    别跑,点个赞再走

    相关文章

      网友评论

          本文标题:【第35天】python全栈从入门到放弃

          本文链接:https://www.haomeiwen.com/subject/kszyectx.html