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. ...
随机推荐
- 【QT】对话框打开图像并用QPixmap显示
绘图设备是指继承QPaintDevice的子类,可以使用QPainter直接在其上面绘制图形,Qt一共提供了四个这样继承QPaintDevice的绘图设备类. 分别是QPixmap.QBitmap.Q ...
- QT 中Widgets-Scene3d例子学习
QT中自带的例子widgets-scene3d实现在基于Widget的应用程序中使用qml 3d场景的功能,我在此基础上,将basicshapes-cpp的例子加以嵌入: 相关代码如下: C++ C ...
- 【hadoop】 hdfs shell 命令交互
1.put 本地文件上传至hdfs中 2. cat 查看内容 3. 删除文件,文件夹 4. ls 5. copyFromLocal 复制本地文件到HDFS , copyToLocal hdfs 复制到 ...
- [Full-stack] 世上最好语言 - PHP
前言 本篇是对个人PHP, Laravel系列博文的总结与思考. 目的在于理清并熟练如下过程: "需求 --> Usercase --> UI --> 框架 --> ...
- python使用requests发送multipart/form-data请求数据
def client_post_mutipart_formdata_requests(request_url,requestdict): #功能说明:发送以多部分表单数据格式(它要求post的消息体分 ...
- C#设计模式--状态模式
设计模式: 状态模式(State Pattern) 简单介绍: 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式. 在状态模式中,我们创建表示 ...
- NHibernate中的API
本篇文章介绍的是NHibernate的各种API及其作用. 下图描述了NHibernate的API在分层架构中的作用,下面将进行详细说明. NHibernate的接口大致分为四类:1. 被应用程序调 ...
- css---颜色过渡渐变
CSS---颜色过渡渐变 <!doctype html> <html lang="en"> <head> <meta charset=&q ...
- WMware 安装 Mac OSX
1,下载unlock.zip工具,破解VMware没有mac选项情况 2. 下载OS X 10.11.1(15B42).cdr 3.MWare虚拟机提示:“锁定文件失败,打不开磁盘或快照所依赖的磁盘” ...
- TensorFlow—softmax_cross_entropy_with_logits函数详解
softmax_cross_entropy_with_logits函数原型: tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=pred ...