魔法方法__del__()
创建对象后,python解释器默认调用__init__()
方法;
当删除对象时,python解释器也会默认调用一个方法,这个方法为__del__()
方法
class Hero(object): # 初始化方法 # 创建完对象后会自动被调用 def __init__(self, name): print('__init__方法被调用') self.name = name # 当对象被删除时,会自动被调用 def __del__(self): print("__del__方法被调用") print("%s 被 GM 干掉了..." % self.name) # 创建对象 taidamier = Hero("泰达米尔") # 删除对象 print("%d 被删除1次" % id(taidamier)) del(taidamier) print("--" * 10) gailun = Hero("盖伦") gailun1 = gailun gailun2 = gailun print("%d 被删除1次" % id(gailun)) del(gailun) print("%d 被删除1次" % id(gailun1)) del(gailun1) print("%d 被删除1次" % id(gailun2)) del(gailun2)
总结
-
当有变量保存了一个对象的引用时,此对象的引用计数就会加1;
-
当使用del() 删除变量指向的对象时,则会减少对象的引用计数。如果对象的引用计数不为1,那么会让这个对象的引用计数减1,当对象的引用计数为0的时候,则对象才会被真正删除(内存被回收)。
例子1:
# del 对象名 -> __del__()方法中 # 一, del方法的作用: 监听对象销毁 # 自定义一个英雄类 class Hero(object): def __init__(self, hp=100): self.hp = hp # 监听对象销毁 # 执行del方法 # 01:监听程序停止后 会被执行 # 02:监听到程序员手动执行le del 对象名 (片面) def __del__(self): print("惨叫一声") print("整个屏幕变灰") print("开始复活倒计时") # 01:创建一个英雄 wk = Hero() wk.hp = 0 # 判断英雄的血量小于等于0的时候 英雄死亡 if wk.hp <= 0: # 死亡 pass # 惨叫一声 # 整个屏幕变灰 # 开始复活倒计时 # 销毁对象 # 格式: del 对象名 del wk input("等待")
运行结果:
惨叫一声
整个屏幕变灰
开始复活倒计时
等待
例子2:
# del 对象名 -> __del__()方法中 # 一, del方法的作用: 监听对象销毁 # 自定义一个英雄类 class Hero(object): def __init__(self, hp=100): self.hp = hp # 监听对象销毁 # 执行del方法 # 01:监听程序停止后 会被执行 # 02:监听到程序员手动执行le del 对象名 (片面) def __del__(self): print("惨叫一声") print("整个屏幕变灰") print("开始复活倒计时") # 02: # 创建一个英雄 wk = Hero() # 程序退出 python会帮我们把对象进行销毁 # del wk
运行结果:
惨叫一声
整个屏幕变灰
开始复活倒计时
例子3:
# del 对象名 -> __del__()方法中 # 一, del方法的作用: 监听对象销毁 # 自定义一个英雄类 class Hero(object): def __init__(self, hp=100): self.hp = hp # 监听对象销毁 # 执行del方法 # 01:监听程序停止后 会被执行 # 02:监听到程序员手动执行le del 对象名 (片面) def __del__(self): print("惨叫一声") print("整个屏幕变灰") print("开始复活倒计时") # 03: wk = Hero() lb = Hero() # 执行了 del wk 和 del lb
运行结果:
惨叫一声
整个屏幕变灰
开始复活倒计时
惨叫一声
整个屏幕变灰
开始复活倒计时
例子4:
# 二, 地址的引用计数问题 # 自定义一个英雄类 class Hero(object): def __init__(self, hp=100): self.hp = hp # 监听对象销毁 # 执行del方法 # 监听到地址的引用计数为0的时候被执行 def __del__(self): print("再见") # 创建一个对象 wk1 = Hero() wk2 = wk1 wk3 = wk1 # 手动销毁对象 # del wk1 del wk2 del wk3 input("等待") # 是否只要再程序中执行了del 对象名 对应的__del__()方法就会被执行? # 不会, 只有在地址的引用计数为0以后才会执行.
运行结果:
等待