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以后才会执行.

    运行结果:

    等待
  • 相关阅读:
    C#中如何禁止WindowsMediaPlayer双击全屏显示
    .NET中的泛型概述
    c# Windows服务管理
    C:Program不是内部或外部命令,也不是可运行的程序或批处理文件。
    Wireshark教程之二:Wireshark捕获数据分析
    Wireshark教程之一:认识Wireshark界面
    利用windows服务实现整点报时功能
    在windows服务中使用定时器
    flickity:支持触摸滑动,响应迅速的幻灯片轮播插件
    无法定位 Local Database Runtime 安装。请验证 SQL Server Express 是否正确安装以及本地数据库运行时功能是否已启用。
  • 原文地址:https://www.cnblogs.com/kangwenju/p/12866590.html
Copyright © 2011-2022 走看看