Python3学习之路~6.4 析构函数
析构函数是在实例释放、销毁的时候执行的,通常用于做一些收尾工作。比如说,关闭一些数据库连接、打开的临时文件等。
#Author:Zheng Na class Role: # 构造函数
def __init__(self,name,role,weapon,life_value=100,money=15000):
self.name = name
self.role = role
self.weapon = weapon
self.life_value = life_value
self.money = money # 类的方法(动态属性)
def buy_gun(self,gun_name):
print("%s just bought %s" %(self.name,gun_name)) def got_shot(self):
print("ah...I got shot...") # 析构函数:在实例对象释放、销毁的时候自动执行
def __del__(self):
print("%s:彻底死了。。。" %self.name) r1 = Role("Alex","Policeman","AK47")
r1.buy_gun("AK47")
r1.got_shot()
# del r1 #删除实例r1 r2 = Role("Jack","terrorist","B22")
r2.buy_gun("B22")
r2.got_shot() # 执行结果1(没有del r1代码):你会发现最后alex先死了,Jack后死了
# Alex just bought AK47
# ah...I got shot...
# Jack just bought B22
# ah...I got shot...
# Alex:彻底死了。。。
# Jack:彻底死了。。。 # 执行结果2(有del r1代码):你会发现最后alex先死了,然后Jack才实例化再死
# Alex just bought AK47
# ah...I got shot...
# Alex:彻底死了。。。
# Jack just bought B22
# ah...I got shot...
# Jack:彻底死了。。。
现在有一个问题,假设我们声明了一个实例r1,然后就调用了一次,以后再也没有用过它,这个程序运行了2年,按理说这个实例只用了一次,应该被销毁。那么Python是否会将其自动销毁呢?答案是否定的。因为Python不知道你的这个实例再也不用了。那么Python如何知道你的实例还在不在用呢?只要你的变量名r1还存在,Python就认为你还要用它。当你del r1时,删除的并不是内存中的数据,而是r1这个变量名,就相当于你把一个小房子的门牌号给拿走了,门牌号拿走就代表这个小房子可以拆了。Python虚拟机里有一个高速循环的计时器,过一会儿就收一次垃圾(发现内存中有一个小房子没有门牌号就立马删除)。所以只要有门牌号(变量名r1)存在,Python就认为你还要用r1,就不会删除,即便你的实际程序不再用它,但Python就是会认为你还要用。所以如果你希望你的代码性能好点儿,就可以手动del r1。
注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
Python3学习之路~6.4 析构函数的更多相关文章
- Python3学习之路~0 目录
目录 Python3学习之路~2.1 列表.元组操作 Python3学习之路~2.2 简单的购物车程序 Python3学习之路~2.3 字符串操作 Python3学习之路~2.4 字典操作 Pytho ...
- Python3学习之路~8.5 SocketServer实现多并发
前面几节我们写的socket都只能实现服务端与一个客户端通信,并不能实现服务端与多客户端同时通信.接下来我们就来学习一下如何实现服务端同时与多个客户端通信,即并发. Socket Server soc ...
- Python3学习之路~9.4 队列、生产者消费者模型
一 队列queue 当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用. 队列的作用:1.解耦,使程序直接实现松耦合 2.提高处理效率 列表与队列都是有顺序的,但是他们之间有一个很大的区别 ...
- Python3学习之路~9.1 paramiko模块:实现ssh执行命令以及传输文件
我们一般使用linux的时候,都是在Windows上安装一个ssh客户端连接上去.那么从一台linux如何连接到另一条linux呢?使用ssh命令即可,因为每台linux机器自己都有一个ssh客户端. ...
- Python3学习之路~8.6 开发一个支持多用户在线的FTP程序-代码实现
作业: 开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp s ...
- Python3学习之路~8.4 利用socket实现文件传送+MD5校验
利用socket实现文件传送,大约分为如下几步: 1.读取文件名2.检测文件是否存在3.打开文件(别忘了最后关闭文件)4.检测文件大小5.发送文件大小给客户端6.等客户端确认7.开始边读边发数据8.m ...
- Python3学习之路~7.5 异常处理
1.异常基础 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!! try: pass except Excepti ...
- Python3学习之路~5.12 hashlib & hmac & md5 & sha模块
hashlib模块用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 import md5 h ...
- Python3学习之路~5.7 Json & pickle 模块
用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps. ...
随机推荐
- [原]Jenkins(三)---Jenkins初始配置和插件配置
/** * lihaibo * 文章内容都是根据自己工作情况实践得出. *版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/5331 ...
- linux 下实用软件工具推荐
截图:Deepin-Screenshot 音乐:deepin-music netease-music 绘图工具:Draw.io Desktop (chrome extension) / www.pro ...
- (domain)域名协议
https://jingyan.baidu.com/article/2c8c281df0afd00008252aa7.html
- ASP.NET MVC + EF 更新的几种方式
1.常用 db.Entry(实体).State = EntityState.Modified;db.SaveChanges(); 2.指定更新 db.Configuration.ValidateOnS ...
- io 流操作hdfs
hdfs 文件上传 本地 --------> 文件系统对象 --------> hdfs 文件系统 输入流 ...
- java获取文件的路径问题
java获取文件的路径问题 在java中读取读取文件,经常因为路径的问题找不到,此文用于记录如何定位文件的简单方法. 本基于springboot做的测试,主要是构建工程方便,所用的方法都是JDK中的方 ...
- C和C指针小记(十)-函数
1.函数的定义 函数的定义就是函数体的实现. 语法: 类型 函数名(形式参数) 代码块 函数返回类型和函数名分开写是代码风格的问题,现代语言如swift返回值在函数名和参数表的后面,这样使得某些工程工 ...
- python-----双色球实现(实例1)
#输出用户指定组数的双色球信息,其中一组信息 6个红色号码获取范围(1-33),1个蓝色号码获取范围(1-16),要求一组信息中红球内号码不可重复 import randomdef get_ball( ...
- http协议-https协议-相对协议
http协议.https协议.相对协议 http://www.baidu.com (使用http协议访问百度) https://wwww.badu.com (使用https协议访问百度) //www. ...
- [troubleshoot][automake] automake编译的时候发生死循环
在某台特有设备上,编译dssl工程时,竟然发生了死循环. https://github.com/tony-caotong/libdssl 错误日志如下: checking zlib.h presenc ...