美文网首页python学习之路
python 弱引用概述

python 弱引用概述

作者: Alcazar | 来源:发表于2019-06-20 09:25 被阅读22次
创建弱引用

可以通过调用weakref模块ref(obj[ , callback] )来创建一个弱引用,obj是你想弱引用的对象,callback是一个可选的函数,当因没有引用导致Python要销毁这个对象时调用。回调函数callback要求单个参数(弱引用的对象)。

【注意】emmmmm....如果项目用到了循环引用,那么就用弱引用,对象才能顺利被垃圾回收。

举个栗子:
创建一个银行账户,如果账户余额减少,则发送信息提醒户主。。。


class Account:

    def __init__(self,name,balance):
        self.name = name
        self.balance = balance
        self.observers = set()

    def register(self,observer):
        self.observers.add(observer)

    def unregister(self,observer):
        self.observers.remove(observer)

    def notify(self):
        for ob in self.observers:
            ob.update()

    def withdraw(self,amt):
        self.balance -= amt
        self.notify()

    def __del__(self):
        for ob in self.observers:
            ob.close()


class AccountObserver:
    def __init__(self,name,account):
        self.name = name
        self.account = account
        # 将自己加入到accound的观察者列表中
        self.account.register(self)

    def update(self):
        print("{} ,Balance is {}".format(self.name,self.account.balance))

    def close(self):
        print("关闭账户")

    def __del__(self):
        self.account.unregister(self)
        del self.account

a = Account("zs", 1000)
a_ob = AccountObserver("aob",a)
b_ob = AccountObserver("bob",a)
c_ob = AccountObserver("cob",a)
print(a_ob)
print(b_ob)
print(c_ob)
#
a.withdraw(100)

<__main__.AccountObserver object at 0x000002924356A080>
<__main__.AccountObserver object at 0x000002924356A0B8>
<__main__.AccountObserver object at 0x000002924356A0F0>
aob ,Balance is 900
bob ,Balance is 900
cob ,Balance is 900

弱引用,新增变量时,变量计数器不会增加

import weakref
from sys import getrefcount


class A:
    def __init__(self):
        pass
    def p(self):
        print("$$$$$$$$$$$$")

a = A()
b = a
c = weakref.ref(a)
print(getrefcount(a))
d = c()
d.p()
print(getrefcount(a))
3
$$$$$$$$$$$$
4

分析一下内存,思考为啥输出从3变成了4...
c是a的弱引用,而,d由c赋值,所以再一次调用getrefcount函数统计时,多调用了一次。


垃圾回收
import gc
print(gc.get_threshold())

Output:(700, 10, 10)
【注释】返回(700, 10, 10),后面的两个10是与分代回收相关的阈值,后面可以看到。700即是垃圾回收启动的阈值(当垃圾积累到700时开始第一次回收,累计10次清理依旧无法清除的垃圾,传入后面分代回收)。阈值可以通过gc中的set_threshold()方法重新设置。
当然,也可以使用 gc.collect() 手动启动垃圾回收

相关文章

  • python 弱引用概述

    创建弱引用 可以通过调用weakref模块的 ref(obj[ , callback] )来创建一个弱引用,obj...

  • Python弱引用

    Python弱引用 弱引用:新增变量时,变量计数器不会增加。弱引用与强引用相对,是指不能确保其引用的对象不会被垃圾...

  • JAVA非并发容器--WeakHashMap

    概述 WeakHashMap的存储结构等与HashMap的结构几乎一样,不同指出是其引用是弱引用。 什么是弱引用?...

  • 【本人秃顶程序员】Java的四种引用类型你都知道吗?

    ←←←←←←←←←←←← 快!点关注 一、概述 在Java中提供了四个级别的引用:强引用,软引用,弱引用和虚引用。...

  • Python 弱引用 学习

    转:python 初步认识弱引用 & 垃圾回收 - 要不,单步调试走起? - CSDN博客

  • 对象的引用

    一、概述 Java对象的引用:强引用,软引用,弱引用和虚引用。众所周知,Java中是JVM负责内存的分配和回收,这...

  • Java的四种引用方式

    概述 强引用 > 软引用 > 弱引用 > 虚引用 强引用的对象的回收条件是GC Roots的可达性,只要可达,则强...

  • Python 弱引用的使用

    和许多其它的高级语言一样,Python使用了垃圾回收器来自动销毁那些不再使用的对象。每个对象都有一个引用计数,当这...

  • Java中的四种引用类型

    1. 概述 在Java虚拟机垃圾收集这一文中,我们谈到了Java中对引用的定义有如下四种:强引用,软引用,弱引用,...

  • weak原理

    weak原理 弱引用指针添加到弱引用表。 NSObject.mm 弱引用的指针存储到弱引用表 通过哈希运算找到弱引...

网友评论

    本文标题:python 弱引用概述

    本文链接:https://www.haomeiwen.com/subject/nsxqqctx.html