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 相关文章推荐
Perl中著名的Schwartzian转换问题解决实现
Jun 02 Python
Python实现的多线程http压力测试代码
Feb 08 Python
python使用xpath中遇到:到底是什么?
Jan 04 Python
pytorch 把MNIST数据集转换成图片和txt的方法
May 20 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
Apr 11 Python
pytorch实现focal loss的两种方式小结
Jan 02 Python
Python自动登录QQ的实现示例
Aug 28 Python
Python pip install之SSL异常处理操作
Sep 03 Python
python 调用Google翻译接口的方法
Dec 09 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
Jan 09 Python
Python try except finally资源回收的实现
Jan 25 Python
python 如何读、写、解析CSV文件
Mar 03 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
亚洲咖啡有什么?亚洲咖啡产地介绍 亚洲咖啡有什么特点?
2021/03/05 新手入门
PHP计算2点经纬度之间的距离代码
2013/08/12 PHP
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
2013/04/08 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
2014/10/22 Javascript
javascript数组遍历for与for in区别详解
2014/12/04 Javascript
js+html5通过canvas指定开始和结束点绘制线条的方法
2015/06/05 Javascript
探讨JavaScript中的Rest参数和参数默认值
2015/07/29 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
2016/03/24 Javascript
iscroll碰到Select无法选择下拉刷新的解决办法
2016/05/21 Javascript
小程序实现左滑删除功能
2018/10/30 Javascript
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
使用vue-router切换页面时,获取上一页url以及当前页面url的方法
2019/05/06 Javascript
[38:44]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第二局
2016/02/25 DOTA
[01:21:07]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
python中的格式化输出用法总结
2016/07/28 Python
Django自定义分页效果
2017/06/27 Python
Python 操作文件的基本方法总结
2017/08/10 Python
python调用虹软2.0第三版的具体使用
2019/02/22 Python
从列表或字典创建Pandas的DataFrame对象的方法
2019/07/06 Python
Pytorch 中retain_graph的用法详解
2020/01/07 Python
Python unittest单元测试框架及断言方法
2020/04/15 Python
python实时监控logstash日志代码
2020/04/27 Python
为什么python比较流行
2020/06/19 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
基于Python组装jmx并调用JMeter实现压力测试
2020/11/03 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
利用canvas实现图片压缩的示例代码
2018/07/17 HTML / CSS
html5实现滑块功能之type="range"属性
2020/02/18 HTML / CSS
打印机墨盒:123Inkjets
2017/02/16 全球购物
台湾森森购物网:U-mall
2017/10/16 全球购物
Annoushka英国官网:英国奢侈珠宝品牌
2018/10/20 全球购物
redis连接被拒绝的解决方案
2021/04/12 Redis
Matlab求解数组中的最大值及它所在的具体位置
2021/04/16 Python
MySQL 查询速度慢的原因
2021/05/25 MySQL
Golang解析JSON对象
2022/04/30 Golang