zoukankan      html  css  js  c++  java
  • 析构方法====

    析构方法  

      某对象  借用了操作系统的资源  还要通过  析构方法  归还回去    : 

                          归还的包括   文件资源   网络资源

      在清楚一个对象  在内存中的使用的时候 ,  会触发 这个对象所在类中的析构方法

                           释放一个空间 之前执行的

      _ _del_ _        del  A的对象

        del  类名()  即对象     会自动触发这个方法  

      e.g 

        class  File:

          def  __init__( self , file_path ):

            self . f=open( file_path )    #创建一个文件的句柄

          def  read( self ) :

            self . f . read( 1024 )

          def  __del__(self) :    #是去归还 / 释放一些在创建对象的时候借用的一些资源

            self . f.close ()

        f =File(' 文件名 ')

        f . read()

          1.  在 del 对象  的时候执行      程序员触发的

          2.  在python解释器的垃圾回收机制  回收这个对象  所占的内存的时候   Python 自动触发的

         不管是主动还是被动  这个f 对象  总会被清理掉

          被清理掉  就会触发 _ _del__方法,  触发这个方法就会归还  操作系统的 文件资源

      python  解释器在内部就能搞定的事儿 : 

          先申请一块空间   ===>  操作系统分配给你的        在这块空间中所有的事都归你的   python解释器来管

        f=open('文件')    #   python  ====>  操作系统===>硬件里边  得文件  ===>    文件的操作符( 文件句柄 )

        f.close()    关闭的是操作系统  从硬件里边  拿出来的那个文件    即  文件资源还给了  操作系统

        del f     #  删除的是  文件的 那个空间里边的  变量和方法    

    item 系列  

      item 系列   和     对象[ ] 访问值有联系

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

      对象[ ]  ====    item

      __getitem__          obj[ ' eejdj ' ]  

      __setitem__           obj[ ' hhfbbf ' ] = ''  kjkj ''   

      __delitem__            del  obj[ ' jkhh ' ] 

     e.g

       obj={ ' k ' : ' v ' }

       print( obj )   ===>  { ' k ' : ' v ' }

       print ( obj[ ' k ' ] )  ===>  v       这样可以实现 

      class  B:

        def   __getitem__( self , item):

          print( '执行啦' , item )

          return   ' bbb ' 

        def  __setitem__( self , key,value ):

          print( key,value )

      b=B()

      print(b[ 'a' ])      #调用了 __getitem__  拿到  返回值    bbb

      print (b [ 'k'] )      #   调用了 __getitem__  拿到  返回值    bbb

      b[ 'k' ] = ' value '        #调用了  __setitem__     执行拿不到返回值    

      print ( b['k'] )    #  调用   __getitem __...

      class B:

        def __getitem__(self , item):

          return getattr( self,item)

        def  __set item__( self, key,value):

          setattr( self,key,value)

        def  __delitem__(self,key):

          delattr(self,key)              

      b=B()

      b[ 'k1' ]='v'       #  先执行 __set item__    将   k1 传给  key    v  传给  value

      print(b.__dict__)      ===>     { 'k1'  : ' v' }

      print( b[ ' k1' ] )     #  执行__getitem__ 将k1传给 item      拿到返回值      v

      del b['k1]      # 执行__delitem__       将键值对删除

              若  __delitem__方法下边是  pass  没有执行删除的步骤    则不会删除

      print( b[ ' k1' ] )     ====>       { }

     e.g

        class  B:

          def  __init__( self , lst ):                #    1

            self .lst =lst

          def  __getitem__( self , item ):        #       2

            return  self.lst [ item ]

          def  __setitem__( self, key, value ):    #   3

            self . lst [ key ] =value

          def  __delitem__( self , key ):  #  4

            self .lst .pop [ key ]

        b=B( [ ' 111 ' , '' 222 '' ,'' ccc'' , '' ddd'' ] )   # 执行1     

        print( b.lst [ 0 ] )   #  执行1     ===>   111

        print( b [ 0 ] )  #  执行2   ===>    111

        b [ 3 ] = '' alex ''    # 执行3 

        print( b.lst )   #     ===>   [ ' 111 ' , '' 222 '' ,'' ccc'' , '' alex'' ]

        del  b[ 2 ]    #   执行4

        print( b.lst )   ====>      [ ' 111 ' , '' 222 ''  , '' alex'' ]

    hash  方法        hash( obj )   obj内部必须要实现了  __hash__算法

      hash 算法:   底层数据结构基于  hash 值寻址的优化操作

        hash 是一个算法:  能够把某个要存在内存里的值  通过一系列 计算 , 保证不同值的hash 结果是不一样的

       对于同一个值  在多次执行python 代码的时候   hash 值不同  

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

            同一次执行表示  右键单击一个Run就是一次执行

    字典的寻址

      一个hash值  代表一个内存      因此找的特别快

    set 集合去重  原理机制:

      先判断hash 值是否一样  ,  当hash值一样的时候  再判断   两端值 是否相等   即判断  是否 ==   

               相当于  当两端的hash 相等的时候  会触发   _ _eq_ _  

      值相等是最准确的判断值相等的方式  == 

          但是  若在集合中采用== 来判断的话,   每次遇到一个值  都会  和之前所有的值都重新比较一次    效率太慢了

        而 hash值  是将每个元素的hash 值算好  ,  每次遇到一个值都会算哈希值 , 算好不同的 直接放到一个  格子当中

            再算第二个 不一样也放到  一个空格子中,    

              当遇到两个hash值一样的时候  ,  即  格子中有 元素的时候  就会判断这两个值是否  ==  ,

                若  ==   则覆盖   否则再放到一个新的格子中

      

    _ _eq_ _     和 ==   一样

      对象1 == 对象2   :  这个语法  完全和__eq__一样   触发的是  __eq__这个方法

      e.g   

        class A:

          def  __init__( self ,name,age ):

            self.name=name

            self.age=age

          def  __eq__(self,other):

            if  self.name==other.age  and  self.name==other.name:

              return  True

        a=A('' alex '' , 83)

        aa=A(''alex '' , 83)

        aaa=A('' alex'',83)

        print(aaa==a==aa)  =====>  True

    一道面试题

     

    给着1000个员工去重      姓名和性别相同的算是  同一个人  去掉

     class Employee:

      def  __init__(self,name,age,sex,partment):       #    封装几个信息属性

        self.name=name

        self.age=age

        self.sex=sex

        self.partment=partment 

      def  __hash__(self):      #    将 姓名和性别的hash值算出来

        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,"name",'python')) 

    for i in range(200):

      employ_lst.append(Employee("wusir",i,"njhgh",'python'))

    for i in range(200):

      employ_lst.append(Employee("wtaibaiir",i,"nkogjhgh",'python'))

    employ_set=set(employ_lst)  #    执行    去重

     for person in employ_lst:

      print(person.__dict)

      

  • 相关阅读:
    利用反射获取类的所有字段
    System.Data.Entity.Internal.AppConfig 类型初始值设定项引发异常
    sql server 修改列类型
    sql server 删除表字段和字段的约束
    sql server 查找字段上的约束
    ASP.NET MVC自定义路由
    初探pandas——索引和查询数据
    初探pandas——安装和了解pandas数据结构
    初探numpy——numpy常用通用函数
    初探numpy——广播和数组操作函数
  • 原文地址:https://www.cnblogs.com/lynysy/p/9409564.html
Copyright © 2011-2022 走看看