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方法

 

原文地址:https://www.cnblogs.com/0627zhou/p/9416391.html