0
点赞
收藏
分享

微信扫一扫

Python析构函数

以沫的窝 2021-09-28 阅读 101

概述

Python中有两个特殊的方法, 一个是构造函数init, 另一个是析构函数del,统称为魔术方法。

构造函数init,创建实例对象之后Python会自动执行此方法,把初始化的属性特点放到实例对象里。

构造函数是创建并初始对象属性,那么对象使用完成后,系统是怎么处理这些呢?

这个时候,Python引入了销毁对象功能的析构函数del()

析构函数del是对象没有被引用时会触发垃圾回收机制,进行内存释放.

1 析构函数介绍

python 内置的del方法称为析构方法。用于实现对象被销毁时所需的操作。

常见的应用常见如:

  1. 执行del 对象,Python解释器会自动回收该对象所占用的应用程序资源(用户太内存)
  2. 当一个程序运行完毕时,会自动触发GC,进而GC会触发析构方法
  3. 释放对象占用的资源,如打开文件资源、网络连接。一般要重写del的功能

析构方法del()是可选的,如果不提供,则Python 会在后台提供默认析构函数

如果要显式的调用析构函数,可以使用del关键字: del obj

2. 析构函数底层机制

析构方法的作用是销毁对象的,在python中采用垃圾回收机制。

Python垃圾回收机制核心思想是:

当对象没有被引用时(引用计数为0),由垃圾回收器调用__del__方法,进行销毁释放内存

详细说明:

  1. Python会对每个对象配置一个计时器,初始Python实例对象的计数器值为0

  1. 当变量A引用改实例对象,其计数器的值会+1

  1. 当变量B也引用了实例对象,计数器的值会再次+1
  2. 当多个变量引用实例对象,计数器值以此类推进行+1

  1. 当变量A取消对该实例对象的引用,计数器值会-1

  1. 当多个变量都对该实例对象的引用,依次类推进行-1

  1. 当计数器值会减到0时,表明没有变量引用实例对象了,即证明程序不在需要它,此时Python就会自动调用del()方法将其回收。

3 析构函数实操

我们主动删除对象调用del 对象;程序运行结束后,python也会自动进行删除其他的对象。

class Animal:
    def __del__(self):
        print("销毁对象{0}".format(self))
cat = Animal()
cat2 = Animal()
del cat2
print("程序结束")

注意:

如果我们重写子类的 del() 方法(父类为非 object 的类),则必须显式调用父类的 del() 方法,这样才能保证在回收子类对象时,其占用的资源(可能包含继承自父类的部分资源)能被彻底释放

class Animal:
    def __del__(self):
        print("调用父类 __del__() 方法")
        
class Bird(Animal):
    def __del__(self):
       # super(Bird,self).__del__()  #方法1:显示调用父类的del方法
        print("调用子类 __del__() 方法")

cat = Bird()
#del cat   #只能调用子类里面的__del__
#super(Bird,cat).__del__() #方法2:显示调用父类的__del__

总结

我们本期学习了Python内置函数析构函数,用于没有被引用的对象进行回收处理,一般情况下,我们不用刻意去调用,python内部会对进行触发。

以上是本期内容,欢迎大佬们评论区指正,下期见~

举报

相关推荐

0 条评论