网站商城与网站区别,资源分享网站怎么做,做aa视频网站,广东网页制作二级考试题目今天学习面向对象里的类被del函数的垃圾回收过程搞的晕头转向#xff0c;经过了老师的讲解还是是懂非懂#xff0c;然后看了很多博客慢慢的心里才有了个大概的了解。
刚刚看到一篇博客#xff0c;觉得讲的很好#xff0c;转载过来以供参考。以下转自笨笨D幸福博客#xff…今天学习面向对象里的类被del函数的垃圾回收过程搞的晕头转向经过了老师的讲解还是是懂非懂然后看了很多博客慢慢的心里才有了个大概的了解。
刚刚看到一篇博客觉得讲的很好转载过来以供参考。以下转自笨笨D幸福博客http://blog.csdn.net/bbdxf/article/details/25774763
探索过程
1、经过查找Python中没有专用的构造和析构函数但是一般可以在__init__和__del__分别完成初始化和删除操作可用这个替代构造和析构。还有一个__new__用来定制类的创建过程不过需要一定的配置此处不做讨论。
2、类的成员函数默认都相当于是public的但是默认开头为__的为私有变量虽然是私有但是我们还可以通过一定的手段访问到即Python不存在真正的私有变量。如
01.__priValue 0 #会自动变形为_类名__priValue的成员变量
3、由于Python的特殊性全局成员变量是共享的所以类的实例不会为它专门分配内容空间类似于static具体使用参看下面的例子。
测试1
01.#encoding:utf8
02.03.classNewClass(object):04. num_count 0 #所有的实例都共享此变量即不单独为每个实例分配
05. def __init__(self,name):06. self.name name07. NewClass.num_count 108. printname,NewClass.num_count
09. def __del__(self):10. NewClass.num_count - 1
11. print Del,self.name,NewClass.num_count12. deftest():13. print aa
14.15.aa NewClass(Hello)16.bb NewClass(World)17.cc NewClass(aaaa)18.19.print Over
调试运行
01.Hello 1
02.World 2
03.aaaa 3
04.Over05.DeException l Hello 2
06.AttributeError: NoneType object has no attribute num_count in ignored07.Exception AttributeError: NoneType object has no attribute num_count in
我们发现num_count 是全局的当每创建一个实例__init__()被调用num_count 的值增一当程序结束后所有的实例会被析构即调用__del__() 但是此时引发了异常。查看异常为 “NoneType” 即 析构时NewClass 已经被垃圾回收所以会产生这样的异常。
但是疑问来了为什么会这样按照C/C等语言的经验不应该这样啊经过查找资料发现
Python的垃圾回收过程与常用语言的不一样Python按照字典顺序进行垃圾回收而不是按照创建顺序进行。所以当系统进行回收资源时会按照类名A-Za-z的顺序依次进行我们无法掌控这里的流程。
明白这些我们做如下尝试
01.#encoding:utf8
02.03.classNewClass(object):04. num_count 0 #所有的实例都共享此变量即不单独为每个实例分配
05. def __init__(self,name):06. self.name name07. NewClass.num_count 108. printname,NewClass.num_count
09. def __del__(self):10. NewClass.num_count - 1
11. print Del,self.name,NewClass.num_count12. deftest():13. print aa
14.15.aa NewClass(Hello)16.bb NewClass(World)17.cc NewClass(aaaa)18.19.delaa20.delbb21.delcc22.23.print Over
调试输出
01.Hello 1
02.World 2
03.aaaa 3
04.Del Hello 2
05.Del World 1
06.Del aaaa 007.Over
OK一切按照我们预料的顺序发生。
但是我们总不能每次都手动回收吧这么做Python自己的垃圾回收还有什么意义
SO继续查找我们还可以通过self.__class__访问到类本身然后再访问自身的共享成员变量即 self.__class__.num_count , 将类中的NewClass.num_count替换为self.__class__.num_count 编译运行如下
01.#encoding:utf8
02.03.classNewClass(object):04. num_count 0 #所有的实例都共享此变量即不单独为每个实例分配
05. def __init__(self,name):06. self.name name07. self.__class__.num_count 108. printname,NewClass.num_count
09. def __del__(self):10. self.__class__.num_count - 1
11. print Del,self.name,self.__class__.num_count12. deftest():13. print aa
14.15.aa NewClass(Hello)16.bb NewClass(World)17.cc NewClass(aaaa)18.19.print Over
结果
01.Hello 1
02.World 2
03.aaaa 3
04.Over05.Del Hello 2
06.Del World 1
07.Del aaaa 0