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 25 Python
pyqt5的QComboBox 使用模板的具体方法
Sep 06 Python
基于python实现KNN分类算法
Apr 23 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
Nov 07 Python
Python日志syslog使用原理详解
Feb 18 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
Mar 01 Python
Python虚拟环境的创建和包下载过程分析
Jun 19 Python
树莓派升级python的具体步骤
Jul 05 Python
详解python UDP 编程
Aug 24 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
Sep 28 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 Python
Django 实现jwt认证的示例
Apr 30 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
PHPCMS的使用小结
2010/09/20 PHP
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
2011/05/18 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
PHP正则验证Email的方法
2015/06/15 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
apache集成php7.3.5的详细步骤
2019/06/20 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
PHP7新特性
2021/03/09 PHP
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
JavaScript闭包详解
2015/02/02 Javascript
JS中多种方式创建对象详解
2016/03/22 Javascript
js检查是否关闭浏览器的方法
2016/08/02 Javascript
jquery实现图片切换代码
2016/10/13 Javascript
JavaScript正则表达式实例详解
2016/10/16 Javascript
javascript实现无法关闭的弹框
2016/11/27 Javascript
vue动态绑定class选中当前列表变色的方法示例
2018/12/19 Javascript
用Electron写个带界面的nodejs爬虫的实现方法
2019/01/29 NodeJs
JS实现的进制转换,浮点数相加,数字判断操作示例
2019/11/09 Javascript
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
Python利用多进程将大量数据放入有限内存的教程
2015/04/01 Python
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
python+numpy按行求一个二维数组的最大值方法
2019/07/09 Python
Python3 全自动更新已安装的模块实现
2020/01/06 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
python 密码学示例——理解哈希(Hash)算法
2020/09/21 Python
python中append函数用法讲解
2020/12/11 Python
普天C++笔试题
2016/03/20 面试题
庆六一活动总结
2014/08/29 职场文书
幼儿园教师师德师风演讲稿:爱我所爱 无悔青春
2014/09/10 职场文书
自愿离婚协议书范本
2014/09/13 职场文书