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)   # 可以发现用不了了。
  • 相关阅读:
    使用 MVVMLight 命令绑定
    使用 MVVMLight 绑定数据
    在VS中安装/使用 MVVMLight
    关于 MVVMLight 设计模式系列
    DoBox 下载
    Visual Studio使用技巧,创建自己的代码片段
    List 和 ObservableCollection的区别
    HTTP 错误 404.3 解决
    WPF 跟踪命令和撤销命令(复原)
    WPF 自定义命令 以及 命令的启用与禁用
  • 原文地址:https://www.cnblogs.com/ydf0509/p/11016292.html
Copyright © 2011-2022 走看看