zoukankan      html  css  js  c++  java
  • python : __del__()

    调用 __del__() 方法,该对象所占用的内存空间不一定就会被释放

    第一种情况:

    1. class CLanguage:
    2. def __init__(self):
    3. print("调用 __init__() 方法构造对象")
    4. def __del__(self):
    5. print("调用__del__() 销毁对象,释放其空间")
    6. clangs = CLanguage()
    7. #添加一个引用clangs对象的实例对象
    8. cl = clangs
    9. del clangs
    10. print("***********")

    程序运行结果为:

    调用 __init__() 方法构造对象
    ***********
    调用__del__() 销毁对象,释放其空间

     

    Python 采用自动引用计数(简称 ARC)的方式实现垃圾回收机制。该方法的核心思想是:每个 Python 对象都会配置一个计数器,初始 Python 实例对象的计数器值都为 0,如果有变量引用该实例对象,其计数器的值会加 1,依次类推;反之,每当一个变量取消对该实例对象的引用,计数器会减 1。如果一个 Python 对象的的计数器值为 0,则表明没有变量引用该 Python 对象,即证明程序不再需要它,此时 Python 就会自动调用 __del__() 方法将其回收。

    以上面程序中的 clangs 为例,实际上构建 clangs 实例对象的过程分为 2 步,先使用 CLanguage() 调用该类中的 __init__() 方法构造出一个该类的对象(将其称为 C,计数器为 0),并立即用 clangs 这个变量作为所建实例对象的引用( C 的计数器值 + 1)。在此基础上,又有一个 clang 变量引用 clangs(其实相当于引用 CLanguage(),此时 C 的计数器再 +1 ),这时如果调用del clangs语句,只会导致 C 的计数器减 1(值变为 1),因为 C 的计数器值不为 0,因此 C 不会被销毁(不会执行 __del__() 方法)。

    如果在上面程序结尾,添加如下语句:

    1. del cl
    2. print("-----------")

    则程序的执行结果为:

    调用 __init__() 方法构造对象
    ***********
    调用__del__() 销毁对象,释放其空间
    -----------

     

    可以看到,当执行 del cl 语句时,其应用的对象实例对象 C 的计数器继续 -1(变为 0),对于计数器为 0 的实例对象,Python 会自动将其视为垃圾进行回收。

     

     

    第二种情况:

    如果我们重写子类的 __del__() 方法(父类为非 object 的类),则必须显式调用父类的 __del__() 方法,这样才能保证在回收子类对象时,其占用的资源(可能包含继承自父类的部分资源)能被彻底释放。为了说明这一点,这里举一个反例:

    1. class CLanguage:
    2. def __del__(self):
    3. print("调用父类 __del__() 方法")
    4. class cl(CLanguage):
    5. def __del__(self):
    6. print("调用子类 __del__() 方法")
    7. c = cl()
    8. del c

    程序运行结果为:

    调用子类 __del__() 方法

  • 相关阅读:
    PF不明内存泄露已解决,白头发也没了(转)
    第06篇 MEF部件的生命周期(PartCreationPolicy)
    [MEF]第05篇 MEF的目录(Catalog)筛选
    [MEF]第04篇 MEF的多部件导入(ImportMany)和目录服务
    [MEF]第03篇 MEF延迟加载导出部件及元数据
    [MEF]第02篇 MEF的导入导出契约
    关于android的设备管理器-DevicePolicyManager(二)
    android KK版本号收到短信后,点亮屏的操作
    windows server 2008 安装Microsoft ActiveSync 6.1提示缺少一个Windows Mobile设备中心所须要的Windows组件
    设计模式
  • 原文地址:https://www.cnblogs.com/sylarwang/p/14043119.html
Copyright © 2011-2022 走看看