Python构造函数及解构函数介绍


Posted in Python onFebruary 26, 2015

python 有一个相应的特殊解构器(destructor)方法名为__del__()。然而,由于python具有垃圾对象回收机制(靠引用计数),这个函数要直到该实例对象所有的引用都被清除掉后才会被执行。python中的解构器是在实例释放前提供特殊处理功能方法,它们通常没有被实现,因为实例很少被显式释放。

在下面的例子中,我们分别创建(并覆盖) __init__()和__del__()构造器及解构函数,然后,初始化类并给同样的对象很多别名。id()内建函数可用来确定引用同一对象的三个别名。最后一步是使用del语句清除所有的别名,显示何时调用了多少次解构器。

#!/usr/bin/env python

#coding=utf-8

 

class P():

    def __del__(self):

        pass

 

class C(P):

    def __init__(self):

        print 'initialized'

    def __del__(self):

        P.__del__(self)

        print 'deleted'

 

 

c1 = C()

c2 = c1

c3 = c1

 

print id(c1), id(c2), id(c3)

 

del c1

del c2

del c3

python没有提供任何内部机制来跟跟踪一个类有多少个实例被创建了,或者记录这些实例是什么东西。如果需要这些功能,可以显式加入一些代码到类定义或者__init__()和__del__()中去。最好的方式是使用一个静态成员来记录实例的个数。靠保存它们的引用来跟踪实例对象是很危险的,因为你必须合理管理这些引用,不然你的引用可能没办法释放(因为还有其他的引用)!看下面的例子:

class InstCt(object):

    count = 0

    def __init__(self):

        InstCt.count += 1

    def __del__(self):

        InstCt.count -= 1

    def howMany(self):

        return InstCt.count

 

a = InstCt()

b = InstCt()

print b.howMany()

print a.howMany()

del b

print a.howMany()

del a

print InstCt.count

所有输出:

initialized

4372150104 4372150104 4372150104

deleted

********************

2

2

1

0
Python 相关文章推荐
python集合类型用法分析
Apr 08 Python
简单说明Python中的装饰器的用法
Apr 24 Python
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
Jun 27 Python
Python 新建文件夹与复制文件夹内所有内容的方法
Oct 27 Python
更改Python的pip install 默认安装依赖路径方法详解
Oct 27 Python
Python面向对象之类和实例用法分析
Jun 08 Python
Django单元测试工具test client使用详解
Aug 02 Python
Pytorch训练过程出现nan的解决方式
Jan 02 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
Apr 19 Python
python 如何利用argparse解析命令行参数
Sep 11 Python
python抢购软件/插件/脚本附完整源码
Mar 04 Python
Python time库的时间时钟处理
May 02 Python
python中的__slots__使用示例
Feb 26 #Python
Python map和reduce函数用法示例
Feb 26 #Python
Python中运行并行任务技巧
Feb 26 #Python
Python通过递归遍历出集合中所有元素的方法
Feb 25 #Python
Python THREADING模块中的JOIN()方法深入理解
Feb 18 #Python
python持久性管理pickle模块详细介绍
Feb 18 #Python
Python中暂存上传图片的方法
Feb 18 #Python
You might like
用PHP实现递归循环每一个目录
2010/08/08 PHP
php下清空字符串中的HTML标签的代码
2010/09/06 PHP
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
PHP 循环删除无限分类子节点的实现代码
2013/06/21 PHP
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
Egret引擎开发指南之视觉编程
2014/09/03 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
2015/04/12 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
2018/08/07 Javascript
js中int和string数据类型互相转化实例
2019/01/16 Javascript
微信小程序实现简易table表格
2020/06/19 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
如何优雅地在Node应用中进行错误异常处理
2019/11/25 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
Python httplib,smtplib使用方法
2008/09/06 Python
浅析使用Python操作文件
2017/07/31 Python
Python+selenium 获取一组元素属性值的实例
2018/06/22 Python
Python 查看list中是否含有某元素的方法
2018/06/27 Python
python matlibplot绘制多条曲线图
2021/02/19 Python
python用plt画图时,cmp设置方法
2018/12/13 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
使用 Python ssh 远程登陆服务器的最佳方案
2020/03/06 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
HTML5地理定位_动力节点Java学院整理
2017/07/12 HTML / CSS
全球领先的各类汽车配件零售商:Advance Auto Parts
2016/08/26 全球购物
开业庆典主持词
2014/03/21 职场文书
留学顾问岗位职责
2014/04/14 职场文书
2015年部门工作总结范文
2015/03/31 职场文书
加薪通知
2015/04/25 职场文书
2016年师德学习心得体会
2016/01/12 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书
python数字转对应中文的方法总结
2021/08/02 Python
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL