python del函数_python中del函数的垃圾回收

今天学习面向对象里的类被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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

武汉船舶职业技术学院计算机分数线,武汉船舶职业技术学院录取分数线2021是多少分(附历年录取分数线)...

武汉船舶职业技术学院录取分数线2020是多少分,各专业录取分数线是多少,是每个填报武汉船舶职业技术学院的考生最关注的问题,随着各省高考录取批次相继公布,考生也开始关心是否被录取,本站小编整理相关信息供参考&#…

linux std::queue 怎么释放内存_电脑卡慢怎么办?一个小工具帮你轻松释放内存,瞬间提升电脑性能...

有一种电脑叫“卡巴死机”大家有没有发现,如今的电子产品越来越不耐用了。无论是电脑,还是手机,超过一年以上,就得考虑更换了。1G变2G,2G升4G,按理说电脑应该会更快更好,实际却是相反&#xff0…

2015计算机二级公共基础知识,2015年计算机二级公共基础知识考点测试题(8)

排序技术1[单选题]对长度n的线性表排序,在最坏情况下,比较次数不是n(n一1)/2的排序方法是(  )。参考答案:D参考解析:排序技术有:①交换类排序法(冒泡排序法、快速排序法);②插入类排序法(简单插入排序、希尔排序);③…

mybatis 自动填充无效_开发小知识-mybatis-plus自动填充与读写分离

mybatis-plus 自动填充说明我们在设计表结构的时候,往往会额外添多如下几个字段create_time【表字段】-- createTime【实体字段】 : 创建时间update_time【表字段】-- updateTime【实体字段】:更新时间create_by【表字段】-- createBy 【实体字段】: 创建…

2020年周数和日期对应表_2020年雅思考试报名截止日期、准考证打印日期和成绩单寄送日期...

2020年雅思考试报名截止日期、准考证打印日期和成绩单寄送日期考试日期类别口试预定 开始日期*报名截止日期准考证 打印日期成绩单 寄送日期*04/01/2020A14/12/201916/12/201925/12/201917/01/202011/01/2020A+G21/12/201923/12/201901/01/202031/01/202016/01/2020…

飞行摇杆设置_HORI皇牌空战7最新飞行摇杆抢先开箱 设计出色布局合理

《皇牌空战7》即将于1月17日发售PS4/Xbox One版,2月1日发售PC版。近日,我们在本作发售之前收到了HORI为《皇牌空战7》量身设计制造的最新一代飞行摇杆。随着《皇牌空战7》即将到来,我们在此为大家做一个简单的先行开箱评测介绍,为…

2021计算机技术调剂,2021年华南师范大学计算机技术考研调剂信息

招生信息学校名称:华南师范大学学校省份:广东学校层次:211;一流学科;学院名称:专业名称:计算机技术专业代码:专业类型:None招生类别:None调剂招收人数:5专业及招生详情研…

latex subfigure_latex-图片插入

作为一个新手入门latex写作,在已有的期刊模板下,我认为不需要每个命令都知道它的参数。我们需要做的就是在最短的时间内完成论文,重点在内容上,而不是说我latex用的很棒。这里,我只给出我平时常用的两种作图方式&#…

为什么只有奇次谐波_治理变频器产生谐波的应用

变频器运行对电网所产生的高分量谐波电流极大的影响了电网质量,使同电网中的用电设备不能正常使用。根据相关的政策法规本文阐述了变频器产生谐波电流的几种治理方案优缺点,结合实际案例重点分析了有源滤波器(APF)在治理变频器产生…

1964年诞生的第一代电子计算机,世界第一台电子计算机诞生的年份是?

满意答案sxh1122014.01.21采纳率:57% 等级:12已帮助:8464人.第一台电子计算机阿塔纳索夫-贝瑞计算机(Atanasoff-Berry Computer,简称ABC)是世界上第一台电子计算机,为艾奥瓦州立大学的约翰文森特阿塔纳索夫(John Vi…

jsp项目开发案例_Laravel中使用swoole项目实战开发案例一 (建立swoole和前端通信)

Laravel中使用swoole项目实战开发案例二(后端主动分场景给界面推送消息)工欲善其事,必先利其器。在正式开发之前我们检查好需要安装的拓展,不要开发中发现这些问题,打断思路影响我们的开发效率。安装 swoole 拓展包安装 redis 拓展包安装 lar…

android 环形时间显示_使用Arduino构建OLED显示屏与Android手机接口的智能手表

背景知识视频教程Arduino 训练营:通过项目学习​viadean.com通过制作Arduino UNO FM收音机接收器学习Arduino I2C​viadean.com通过构建实际应用程序来掌握Arduino - 国外课栈​viadean.com我们大多数人都熟悉162点阵液晶显示器,它在许多项目中用于向用户…

计算机的安全设置在哪儿,电脑防火墙在哪里设置

随着微软系统的更新,现在的Windows 10系统对于网络防护非常的安全,但是有的朋友电脑需要测试一些软件,就需要关闭电脑的防火墙,但是不懂怎么设置电脑防火墙,不用担心下面就让小编教你电脑防火墙在哪设置吧。下面电脑防…

python的加减乘除运算_python实现四则运算

https://gitee.com/szh123/four_arithmetic_implementation.git 1.需求分析: 实现四则运算题目及答案生成,控制生成题目的个数,题目中数值不超过10且有分数存在并用真分数表示。 可以生成10000道题 运算符不超过3个 题目不能出现重复即不能经…

python的内置函数string_Python错误:内置函数或方法对象没有属性“StringIO”

我只想下载一张图片。然后上传到Amazon S3。但它不起作用。在builtin_function_or_method object has no attribute StringIOTraceback (most recent call last):File "flickrDump.py", line 16, in imgpath s3.upload_thumbnail(thumbnail_nametools.randomString(…

微众银行软件测试笔试题,微众银行4月8日笔试题目及部分代码

AC,大致思路就是算一下该字符串能组成的最大回文长度,然后按差值奇偶性输出胜利者,本来以为“最优策略”的删除任意一个字符会很复杂,但是试了下就过了。import java.util.Scanner;public class Main {public static void main(St…

python 多进程 多核_go/node/python 多进程与多核cpu

node node单线程,没有并发,但是可以利用cluster进行多cpu的利用。cluster是基于child_process的封装,帮你做了创建子进程,负载均衡,IPC的封装。 const cluster require(cluster); const http require(http); if (clu…

水晶底是什么材质_蓝宝石水晶镜面,贵是有道理的!

表友们在选择手表的时候,常常会在意机芯、性能等,但是你第一眼爱上的往往是它的外观。在手表上,有一样部件,你总是最先看到,占据着你视线的C位,但是你却总是忽略它。这个部分就是表镜,这个重要却…

str计算机中代表什么,STR到底是待机还是休眠

1。为什么需要待机、休眠尽管电脑硬件运行速度越来越快,但操作系统的体积也在不断膨胀,使得电脑开、关机时,启动、关闭的程序越来越多,花费时间也越来越漫长。因此如何让电脑能够快速启动、一开机就进入Windows,就成为…

科骏达导航端口测试软件,不用端口检测工具也可以知道机器端口,波特,分辨率...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1. 富威: COM2/48002. 索菱、索莱特: COM3/96003. 凯振: COM2/96004. 路特仕、图音: COM2/96005. 卡仕达、科骏达: COM1/9600或COM6/48006. 欧华: COM2/96007.…