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 相关文章推荐
wxPython事件驱动实例详解
Sep 28 Python
Python基础语法(Python基础知识点)
Feb 28 Python
浅析Python中的for 循环
Jun 09 Python
Python教程之全局变量用法
Jun 27 Python
Python实现获取命令行输出结果的方法
Jun 10 Python
Python单元测试实例详解
May 25 Python
用Python shell简化开发
Aug 08 Python
python列表list保留顺序去重的实例
Dec 14 Python
Django 配置多站点多域名的实现步骤
May 17 Python
解决Python内层for循环如何break出外层的循环的问题
Jun 24 Python
python日期与时间戳的各种转换示例
Feb 12 Python
python通过opencv调用摄像头操作实例分析
Jun 07 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命名空间学习详解
2014/02/27 PHP
php调用c接口无错版介绍
2014/03/11 PHP
php实现的百度搜索某地天气的小偷代码
2014/04/23 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
一些常用的Javascript函数
2006/12/22 Javascript
JS中简单的实现像C#中using功能(有源码下载)
2007/01/09 Javascript
javascript编程起步(第二课)
2007/02/27 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
在AngularJS中如何使用谷歌地图把当前位置显示出来
2016/01/25 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
详解数组Array.sort()排序的方法
2020/05/09 Javascript
bootstrap常用组件之头部导航实现代码
2017/04/20 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
在Vue中使用echarts的方法
2018/02/05 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
2018/05/15 Javascript
js html实现计算器功能
2018/11/13 Javascript
基于node简单实现RSA加解密的方法步骤
2019/03/21 Javascript
原生js代码能实现call和bind吗
2019/07/31 Javascript
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
vue-froala-wysiwyg 富文本编辑器功能
2019/09/19 Javascript
关于layui 下拉列表的change事件详解
2019/09/20 Javascript
详解用js代码触发dom事件的实现方案
2020/06/10 Javascript
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
利用Python中的mock库对Python代码进行模拟测试
2015/04/16 Python
Django框架教程之正则表达式URL误区详解
2018/01/28 Python
python实现手机通讯录搜索功能
2018/02/22 Python
详解python算法之冒泡排序
2019/03/05 Python
python路径的写法及目录的获取方式
2019/12/26 Python
python基于property()函数定义属性
2020/01/22 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
利用Python批量识别电子账单数据的方法
2021/02/08 Python
运动会口号16字
2014/06/07 职场文书
社区志愿者活动方案
2014/08/18 职场文书
领导干部个人整改措施落实情况汇报
2014/10/29 职场文书
服装区域经理岗位职责
2015/04/10 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书