python析构函数
析构函数,这样在类实例所占内存被回收时,系统就会自动调用析构函数。通常,我们会在析构函数中做一些“清理”工作,比如释放资源,关闭连接,或者发送一个网络包到其它服务以告知其状态变化等等。
class Role:
def __init__(self, name, role, weapon, life_value=100, money=15000):
#构造函数
#在实例化时做一些类的初始化的工作
self.name = name #r1.name=name实例变量(静态属性),作用域就是实例本身
self.role = role
self.weapon = weapon
self.__life_value = life_value
self.money = money
def __del__(self):
pass #print("%s 彻底死了。。。。" %self.name)
而类实例所占内存被回收,包含以下几种情况:
- 局部变量离开它的作用域
动态分配的内存被手动回收(
new
和delete
)使用智能指针
shared_ptr
,uniq_ptr
都归结为此类进程退出,包括主动退出(
exit()
)和异常退出(未捕获信号)(程序退出的时候也会执行)
以上所有情况都会促使类的析构函数被自动调用。当然,如果是机器挂了,那就没办法了。。。
那么在Python中,如何实现“析构函数”的功能呢?
__del__()
Python提供的最接近“析构函数”的概念,应该就是__del__()
解构器方法了。使用方法如下:
class Test(object):
def __del__(self):
print '__del__ called'
但是,Python中所有的变量其实都是对内存对象的引用。只有当一个内存对象的引用计数降为0,即没有被变量引用时,解释器的垃圾回收机制才会回收这块内存。只有当内存被真正回收时,__del__
方法才会被调用。
我们在命令行下进行如下测试:
>>> t1 = Test()
>>> t2 = Test()
>>> del t1
>>> del t2
只有在对t1和t2都执行del
操作后,__del__
才被调用。