zoukankan      html  css  js  c++  java
  • Python_021(内置方法讲解二)

    一.内置方法二

    1.__del__方法:

      a:构造方法:创建一个空间,  析构方法;释放一个空间;

      b:触发del的情况:Python解释器的垃圾回收机制,和遇到 del 对象名

    c:析构方法的思想:

    class A:
        def __del__(self):
            print(self)
    a = A()
    del a            #这里先执行了__del__方法,再删除对象a,因为执行__del__方法时还要传入self;
    print(a)
    #输出结果:
    <__main__.A object at 0x0000013CF5F59128>  被执行了
    Traceback (most recent call last):
      File "D:/Python/course/23.模块/day23/3.析构方法.py", line 49, in <module>
        print(a)
    NameError: name 'a' is not defined

    d:python的垃圾回收机制:

    class A:
        def __del__(self):
            print('Python解释器会在程序跑结束后执行我')
    a = A()
    print(a)
    #输出结果:
    <__main__.A object at 0x000001F823159128>
    Python解释器会在程序跑结束后执行我

    总结:del方法:是去归还/释放一些在创建对象时借用的一些资源(有可能是操作系统的资源)

    例子:像一些常用的变量在Python底层的一些对象,都有Python解释器帮你回收,

    而像一些像操作系统借用的资源就需要你执行回收方法自己释放;

    像文件句柄;执行close操作,还有一些网络资源;

    3.计算机内部执行一些小常识:

    a:申请一块空间 操作系统会分配给你的  b:在这一块空间之内的所有事,归你的Python解释器管理;

    *****所以在你借用了操作系统资源时,在程序结束之前要还回去,在del方法中写关闭代码;

    4.item系列:

    1)getitem:对象['key']触发该方法;

    class A:
         def __getitem__(self, item):
        print(item)
        return item      #[item]触发getitem方法
    a = A()
    print(a['a'])
    #输出结果:
    a  a

    2)getitem和setitem的一些结合应用:

    class A:
        def __getitem__(self, item):
        return getattr(self,item)    #相当于self.key
        def __setitem__(self, key, value):
        setattr(self,key,value)   #相当于self.key = value
    a = A()
    a['k'] = 'v'
    print(a['k'])
    
    
    class A:
        def __setitem__(self, key, value):
        self.key = value
        def __getitem__(self, item):
        return self.key
    a = A()
    a['k'] = 'v'
    print(a['k'])
    #这两段代码的结果一样都是v,上面用到了映射

    5.__hash__方法:

    1)底层数据结构基于hash值寻址的优化操作
    2) hash是一个算法,保证不同值的hash结果不一样的
    对同一个值多次在Python解释器中执行的时候,hash值是不同的
    但是对同一个值,在同一次执行Python代码的时候hash值永远不变
    3)hash值不是万能的,有可能两个值的hash值相同,所以如果在一个变量进行hash算法之后发现地址有值,会进行一个判断,判断两个变量的值是否相等,若相等覆盖,若不等,则对这个变量再进行二次寻址,也遵循一个算法;

    4)hash和eq(obj)  # obj内部必须含有__hash__方法

    class A:
        def __init__(self,name):
            self.name = name
        def __eq__(self, other):
            if self.name == other.name:
                return True
    a = A('s')
    b = A('s')
    c = A('s')
    print(a == b == c)
    #输出结果
    True

    ::::::==触发对象中的eq方法

     

  • 相关阅读:
    cnblog项目--20190309
    django js引入失效问题
    Python老男孩 day16 函数(六) 匿名函数
    Python老男孩 day16 函数(五) 函数的作用域
    Python老男孩 day15 函数(四) 递归
    Python老男孩 day15 函数(三) 前向引用之'函数即变量'
    Python老男孩 day15 函数(二) 局部变量与全局变量
    Python老男孩 day14 函数(一)
    Python老男孩 day14 字符串格式化
    Python老男孩 day14 集合
  • 原文地址:https://www.cnblogs.com/0627zhou/p/9416391.html
Copyright © 2011-2022 走看看