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__() 方法

  • 相关阅读:
    JID 2.0 RC4 发布,高性能的 Java 序列化库
    FBReaderJ 1.6.3 发布,Android 电子书阅读器
    Arquillian 1.0.3.Final 发布,单元测试框架
    JavaScript 的宏扩展 Sweet.js
    Hypertable 0.9.6.5 发布,分布式数据库
    JRuby 1.7.0 发布,默认使用 Ruby 1.9 模式
    httppp 1.4.0 发布,HTTP响应时间监控
    Redis 2.6.0 正式版发布,高性能K/V服务器
    OfficeFloor 2.5.0 发布,IoC 框架
    XWiki 4.3 首个里程碑发布
  • 原文地址:https://www.cnblogs.com/sylarwang/p/14043119.html
Copyright © 2011-2022 走看看