程序执行与析构函数的调用顺序问题

Posted 有一天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序执行与析构函数的调用顺序问题相关的知识,希望对你有一定的参考价值。

我们发现,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参数

以上是关于程序执行与析构函数的调用顺序问题的主要内容,如果未能解决你的问题,请参考以下文章

关于类继承的构造与析构调用分析

C++ 类的继承三(继承中的构造与析构)

当类构造与析构的时候...

当类构造与析构的时候...

C++:对象和类|| 类的构造函数与析构函数

C++:对象和类|| 类的构造函数与析构函数