zoukankan      html  css  js  c++  java
  • 面向对象-双下方法

    一.析构方法:__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不是每次都触发,只有哈希值相等的时候才触发

  • 相关阅读:
    Delphi XE5 android 蓝牙通讯传输
    Delphi XE5 android toast
    Delphi XE5 android openurl(转)
    Delphi XE5 如何设计并使用FireMonkeyStyle(转)
    Delphi XE5 android 捕获几个事件
    Delphi XE5 android listview
    Delphi XE5 android 黑屏的临时解决办法
    Delphi XE5 android popumenu
    Delphi XE5 android 获取网络状态
    Delphi XE5 android 获取电池电量
  • 原文地址:https://www.cnblogs.com/ITdong-1/p/9419627.html
Copyright © 2011-2022 走看看