zoukankan      html  css  js  c++  java
  • 程序执行与析构函数的调用顺序问题

    我们发现,num_count 是全局的,当每创建一个实例,__init__()被调用,num_count 的值增一,当程序结束后,所有的实例会被析构,即调用__del__() 但是此时引发了异常。查看异常为 “NoneType” 即 析构时NewClass 已经被垃圾回收,所以会产生这样的异常。

            但是,疑问来了?为什么会这样?按照C/C++等语言的经验,不应该这样啊!经过查找资料,发现:

            Python的垃圾回收过程与常用语言的不一样,Python按照字典顺序进行垃圾回收,而不是按照创建顺序进行。所以当系统进行回收资源时,会按照类名A-Za-z的顺序,依次进行,我们无法掌控这里的流程。

         明白这些,我们做如下尝试:

    1. class NewClass(object):  
    2.     num_count = # 所有的实例都共享此变量,即不单独为每个实例分配  
    3.     def __init__(self,name):  
    4.         self.name = name  
    5.         NewClass.num_count += 1  
    6.         print name,NewClass.num_count  
    7.     def __del__(self):  
    8.         NewClass.num_count -= 1  
    9.         print "Del",self.name,NewClass.num_count  
    10.     def test():  
    11.         print "aa"  
    12.   
    13. aa = NewClass("Hello")  
    14. bb = NewClass("World")  
    15. cc = NewClass("aaaa")  
    16.   
    17. del aa  
    18. del bb  
    19. del cc  
    20.   
    21. print "Over"

    区分所有的类对象公用的全局变量num_count和单个对象空间的name参数

  • 相关阅读:
    Linux 安装中文man手册
    centos6.9使用NTFS-3G挂载ntfs文件系统
    Linux基础知识之挂载详解(mount,umount及开机自动挂载)
    技术点总结
    SQL 分组后获取其中一个字段最大值的整条记录 【转载】
    线程池之ThreadPool类与辅助线程
    Task.Run使用默认线程池
    VS生成事件
    线程池之ThreadPoolExecutor使用
    Sql笔记
  • 原文地址:https://www.cnblogs.com/wskgjmhh/p/7553860.html
Copyright © 2011-2022 走看看