• 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解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

      

  • 相关阅读:
    02类的介绍
    Java图解
    String s=new String("abc")创建了几个对象?
    神经网络(13)--具体实现:random initialization
    神经网络(12)--具体实现:如何对back propagation的正确性进行验证
    神经网络(11)--具体实现:unrolling parameters
    神经网络(10)--有助于对神经网络Backpropagation算法的理解
    神经网络(9)--如何求参数: backpropagation algorithm(反向传播算法)
    神经网络(8)---如何求神经网络的参数:cost function的表达
    神经网络(7)---多分类问题
  • 原文地址:https://www.cnblogs.com/zhengna/p/9599019.html
Copyright © 2020-2023  润新知