83.魔法方法__del__()

魔法方法__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以后才会执行.

运行结果:

等待
原文地址:https://www.cnblogs.com/kangwenju/p/12866590.html