zoukankan      html  css  js  c++  java
  • 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以后才会执行.

    运行结果:

    等待
  • 相关阅读:
    异步--记录
    css过渡——实现元素的飞入飞出
    使用touch操作图片
    .net mvc中epplus导出excel
    html无卡顿动画实现——requestAnimationFrame
    调用手机摄像头并上传图片--jquery ajax
    jquery form表单赋值封装
    记录
    .net mvc 使用 aspose.cells导出数据
    explain简介
  • 原文地址:https://www.cnblogs.com/kangwenju/p/12866590.html
Copyright © 2011-2022 走看看