美文网首页
【第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