• 面向对象-双下方法


    一.析构方法:__del__ :释放一个空间之前执行

    用处:某对象借用了操作系统的资源,要通过析构方法归还回去 (垃圾回收机制)

    操作系统资源:文件资源,网络资源

    class A:
        def __del__(self):
                  #析构方法,del A的对象,会自动触发这个方法
            print('执行方法')
    a = A()
    del a  #对象的删除 del
    print(a)  #找不到a 会报错    
    #处理文件例子
    class File:
        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()
    #不管是主动还是被动,这个f对象总会被清理掉,被清理掉就触发__del__方法,触发这个方法就会归还操作系统
    #的文件资源

    注意:f.close 是释放操作系统打开的文件资源 del f 是释放python解释器的内存

     二.item系列: 和对象使用[]访问值有关

    用处:在一些内置模块中,有一些特殊的方法,要求对象必须实现__getitem__/__setitem__才能使用

    class A:
        def __getitem__(self, item):
            return getattr(self,item)
        def __setitem__(self, key, value):
            setattr(self,key,value)
        def __delitem__(self,key):
            delattr(self,key)
    a = A()
    print(a.__dict__)
    a['k'] = 'v'
    print(a.__dict__)
    print(a['k'])
    del a['k']
    print(a.__dict__)
    #结果:
    {}
    {'k': 'v'}
    v
    {}

    三.__hash__/__sq__

    hash方法:底层数据结构基于hash值寻址的优化操作,hash是一个算法,能够把某一个要存在内存里的

    值通过一系列计算,保证不同值的hash结果是不一样的.

    记住:对同一值多次执行python代码的时候hash值是不一样的

      对同一值一次性执行python代码的时候hash值永远不变

    ps:字典的key基于哈希算法,set集合去重机制也是基于hash算法

    set集合去重机制:先通过哈希算法,取到一个空间,看里面有没有值,没有就填进去,有就在对值进行比较.不一样的话,进行二次寻址,,一样的话,覆盖.

    hash(obj):obj内部必须实现__hash__方法

    __eq__  ==这个语法是完全和__eq__相关的,__eq__返回的所有值都是当成布尔值来查看

    class A:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    a = A('张三',20)
    a1 = A('张三',20)
    print(a == a1)
    #结果:Flase #判断的是内置地址所以为Flasd

    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('张三',20)
    a1 = A('张三',20)
    print(a==a1)
    #结果:True

    一道面试题

     一个类
    # 对象的属性 : 姓名 性别 年龄 部门
    # 员工管理系统
    # 内部转岗 python开发 - go开发
    # 姓名 性别 年龄 新的部门
    # alex None 83 python
    # alex None 85 luffy
    600个员工
    # 如果几个员工对象的姓名和性别相同,这是一个人
    # 请对这600个员工做去重
    
    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)
    for person in employ_set:
        print(person.__dict__)
    View Code

    set的去重机制:先调用hash,在调用eq,eq不是每次都触发,只有哈希值相等的时候才触发

  • 相关阅读:
    css学习总结
    bootstrap的学习总结
    一些组件配置的理解
    php 微信公众号支付(小程序也是这么支付的)
    mysql 链接超过ip限制时的报错
    php生成二维码
    wamp配置虚拟主机 php 5.6.25
    php 渣全的循环
    4、kafka、spark streaming
    gauss消元
  • 原文地址:https://www.cnblogs.com/ITdong-1/p/9419627.html
Copyright © 2020-2023  润新知