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统计日志中每个IP出现次数的方法
Jul 06 Python
Python中的字符串查找操作方法总结
Jun 27 Python
Python中动态检测编码chardet的使用教程
Jul 06 Python
python机器学习理论与实战(五)支持向量机
Jan 19 Python
python石头剪刀布小游戏(三局两胜制)
Jan 20 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
Apr 29 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
Jun 13 Python
ubuntu上安装python的实例方法
Sep 30 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
Jan 07 Python
Pytest mark使用实例及原理解析
Feb 22 Python
Pycharm修改python路径过程图解
May 22 Python
Python 实现自动登录+点击+滑动验证功能
Jun 10 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中echo和print的区别
2014/08/28 PHP
CI框架集成Smarty的方法分析
2016/05/17 PHP
基于jquery的inputlimiter 实现字数限制功能
2010/05/30 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
14个有用的Jquery技巧分享
2015/01/08 Javascript
JavaScript中操作Mysql数据库实例
2015/04/02 Javascript
jQuery定义插件的方法
2015/12/18 Javascript
Node.js连接postgreSQL并进行数据操作
2016/12/18 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
2017/01/08 Javascript
footer定位页面底部(代码分享)
2017/03/07 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
jQuery实现获取选中复选框的值实例详解
2018/06/28 jQuery
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
2018/09/21 Javascript
使用Vue CLI创建typescript项目的方法
2019/08/09 Javascript
[01:44]剑指西雅图 展望TI之CIS战队专访
2014/06/25 DOTA
[03:08]TI9战队档案 - Vici Gaming
2019/08/20 DOTA
python使用mailbox打印电子邮件的方法
2015/04/30 Python
浅析Python中的多条件排序实现
2016/06/07 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
在Python中获取操作系统的进程信息
2019/08/27 Python
python实现XML解析的方法解析
2019/11/16 Python
python 实现仿微信聊天时间格式化显示的代码
2020/04/17 Python
Python脚本破解压缩文件口令实例教程(zipfile)
2020/06/14 Python
html5使用canvas画三角形
2014/12/15 HTML / CSS
稀有和绝版书籍:Biblio.com
2017/02/02 全球购物
2014年教师学期工作总结
2014/11/08 职场文书
介绍信的写法
2015/01/31 职场文书
民事起诉状范文
2015/05/19 职场文书
有关朝花夕拾的读书笔记
2015/06/29 职场文书
2019最新激励员工口号大全!
2019/06/28 职场文书
详解redis在微服务领域的贡献
2021/10/16 Redis
mysql事务隔离级别详情
2021/10/24 MySQL
Python turtle编写简单的球类小游戏
2022/03/31 Python
Golang 链表的学习和使用
2022/04/19 Golang