我们发现,num_count 是全局的,当每创建一个实例,__init__()被调用,num_count 的值增一,当程序结束后,所有的实例会被析构,即调用__del__() 但是此时引发了异常。查看异常为 “NoneType” 即 析构时NewClass 已经被垃圾回收,所以会产生这样的异常。
但是,疑问来了?为什么会这样?按照C/C++等语言的经验,不应该这样啊!经过查找资料,发现:
Python的垃圾回收过程与常用语言的不一样,Python按照字典顺序进行垃圾回收,而不是按照创建顺序进行。所以当系统进行回收资源时,会按照类名A-Za-z的顺序,依次进行,我们无法掌控这里的流程。
明白这些,我们做如下尝试:
- class NewClass(object):
- num_count = 0 # 所有的实例都共享此变量,即不单独为每个实例分配
- def __init__(self,name):
- self.name = name
- NewClass.num_count += 1
- print name,NewClass.num_count
- def __del__(self):
- NewClass.num_count -= 1
- print "Del",self.name,NewClass.num_count
- def test():
- print "aa"
- aa = NewClass("Hello")
- bb = NewClass("World")
- cc = NewClass("aaaa")
- del aa
- del bb
- del cc
- print "Over"
区分所有的类对象公用的全局变量num_count和单个对象空间的name参数