析构函数是在实例释放、销毁的时候执行的,通常用于做一些收尾工作。比如说,关闭一些数据库连接、打开的临时文件等。
#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解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。