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)   # 可以发现用不了了。
复制代码

 

posted @   北风之神0509  阅读(2381)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示