zoukankan      html  css  js  c++  java
  • python的WeakKeyDictionary类和weakref模块的其他函数

    python的WeakKeyDictionary类和weakref模块的其他函数

    # -*- coding: utf-8 -*-
    # @Author  : ydf
    # @Time    : 2019/6/13 13:18
    import time
    import weakref
    from app.utils_ydf import nb_print
    class A():
        def __init__(self,x):
            self._x = x
    
        def __repr__(self):
            return f'A类的{self._x}实例 {id(self)}'
    
        def __del__(self):
            nb_print(f'摧毁啦 {self._x} 。。。。')
    
    
    wd = dict()
    # wd = weakref.WeakKeyDictionary()
    
    a1 = A(1)
    a2 = A(2)
    
    
    
    wd[a1] = 'xxxxxxx'
    wd[a2] = 'yyyyyyy'
    
    nb_print('销毁a1对象前')
    for item in wd.items():
        nb_print(item)
    
    
    del a1
    nb_print('销毁a1对象后')
    for item in wd.items():
        nb_print(item)

    while 1:
    time.sleep(10) # 阻止退出触发del,导致不方便观察

     使用普通dict

    使用 weakref.WeakKeyDictionary对比使用普通字典,可以看到不同的地方是销毁a1后,普通字典中还有a1这个键,并且del a1时 无法触发A类的__del__方法,。

    除此之外还有weakvaluedictionary和weakset这些对象。

    weakref里面的函数。

    class TestObj:
        def __init__(self):
            self.xx = 666
    
    
    def test_func(reference):
        nb_print('Hello from Callback function!')
    
        nb_print(reference, 'This weak reference is no longer valid')
    
    
    t = TestObj()
    
    # 建立一个a的弱引用
    nb_print(t.xx)
    t_ref = weakref.ref(t, test_func)
    nb_print(t_ref().xx)
    t.xx = 777
    nb_print(t_ref().xx)
    
    del t
    nb_print(t_ref().xx)   # 可以发现用不了了。
  • 相关阅读:
    web安全
    WCF通信架构
    WCF地址
    WCFContracts(契约)
    分布式中的王者WCF
    SOAP 介绍
    诊所管理软件
    MFC 画图CDC双缓冲
    Linux 启动、关闭、重启网络服务
    C# 除法的小数点问题
  • 原文地址:https://www.cnblogs.com/ydf0509/p/11016292.html
Copyright © 2011-2022 走看看