广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python的弱引用
  • 512
分享到

Python的弱引用

Python 2023-01-31 07:01:15 512人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

python的弱引用指引用一个对象但不增加它的引用计数器。这么做的好处是什么呢?什么时候需要考虑用若引用呢? 假设我们在设计一个游戏,有一个角色类Char,我们要给他添加一个效果(比如中毒),于是设计了一个效果类Effect。现在,给角色增

python的弱引用指引用一个对象但不增加它的引用计数器。这么做的好处是什么呢?什么时候需要考虑用若引用呢?

假设我们在设计一个游戏,有一个角色类Char,我们要给他添加一个效果(比如中毒),于是设计了一个效果类Effect。现在,给角色增加效果看上去就像这样:

  1. char.effect = Effect() # 给角色添加一个效果

每个效果生效的时机都是不同的,为了方便复用,我们再设计一个激活策略类ActivePloy,负责激活效果。于是在Effect和ActivePloy的内部看上去就像这样:

  1. class Effect(object):   
  2.     def __init__(self):   
  3.         self.active_ploy = ActivePloy(self) 
  4.  
  5.     def active(self): 
  6.         """激活时的处理""" 
  7.         pass 
  8.  
  9.  
  10. class ActivePloy(object): 
  11.     def __init__(self, effect): 
  12.         self.effect = effect 
  13.  
  14.     def active(self): 
  15.         """激活时,激活对应效果""" 
  16.         self.effect.active() 

这样做的好处是Effect不用关心自己何时激活,激活的判断都放给ActivePloy来处理。看上去挺好的,但是,这里面有一个问题,就是当我们试图给玩家去掉这个效果时……

  1. del char.effect 

仔细想想,这么干以后,Effect的实例其实是没有被回收的,因为Effect和ActivePloy交叉引用,他们的引用计数都为1。

那么我们为了干净的删除effect,似乎就只能手动的来清理一下他们之间的这个交叉引用了:

  1. class Effect(object):    
  2.     def __init__(self):    
  3.         self.active_ploy = ActivePloy(self)  
  4.   
  5.     def active(self):  
  6.         """激活时的处理"""  
  7.         pass  
  8.   
  9.     def destroy(self): 
  10.         self.active_ploy.destroy() 
  11.   
  12. class ActivePloy(object):  
  13.     def __init__(self, effect):  
  14.         self.effect = effect  
  15.   
  16.     def active(self):  
  17.         """激活时,激活对应效果"""  
  18.         self.effect.active() 
  19.  
  20.     def destroy(self): 
  21.         self.effect = None 

于是我们要删除一个效果,就得这样:

  1. char.effect.destroy() 
  2. del char.effect 

太麻烦了,不是吗?而且万一一个效果有多个激活策略的话,必须保证Effect把每个ActivePloy的destroy方法都运行一遍,漏了一个都无法保证自身被干净的删除。

我们来分析一下,之所以这么麻烦,就是因为ActivePloy对Effect有一个引用。那么如果ActivePloy不引用Effect不就OK了?这个时候,让我们来试试弱引用。

  1. import weakref 
  2. class Effect(object):    
  3.     def __init__(self):    
  4.         self.active_ploy = ActivePloy(self)  
  5.   
  6.     def active(self):  
  7.         """激活时的处理"""  
  8.         pass  
  9.   
  10.   
  11. class ActivePloy(object):  
  12.     def __init__(self, effect):  
  13.         self.effect = weakref.proxy(effect) # 弱引用effect 
  14.   
  15.     def active(self):  
  16.         """激活时,激活对应效果"""  
  17.         self.effect.active() 

代码只有一个地方改变了,就是

  1. self.effect = weakref.proxy(effect) 

这句的效果就是self.effect可以像往常一样的使用,但是却不会增加effect的引用计数器。换言之,这样写,他们之间的交叉关系消失了!这个时候我们只需要单纯的删掉char.effect,Effect和ActivePloy的实例都会被销毁。

什么,假设ActivePloy在其他地方也被引用了?这样当然只有effect会被销毁。但是我们想让ActivePloy必然随着Effect的销毁而销毁,怎么办呢?那么我们可以改改,给弱引用加上一个回调函数:

  1. class ActivePloy(object):   
  2.     def __init__(self, effect):   
  3.         self.effect = weakref.proxy(effect, self.on_effect_destroy) # 弱引用effect  
  4.    
  5.     def active(self):   
  6.         """激活时,激活对应效果"""   
  7.         self.effect.active()  
  8.  
  9.     def on_effect_destroy(self, effect): 
  10.         """ 
  11.         effect销毁时会调用这个方法,在这里把对自己的引用都清理干净吧 
  12.         """ 
  13.         pass 

这样一来,就不用担心删不干净了。

--结束END--

本文标题: Python的弱引用

本文链接: https://www.lsjlt.com/news/190779.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python的弱引用
    python的弱引用指引用一个对象但不增加它的引用计数器。这么做的好处是什么呢?什么时候需要考虑用若引用呢? 假设我们在设计一个游戏,有一个角色类Char,我们要给他添加一个效果(比如中毒),于是设计了一个效果类Effect。现在,给角色增...
    99+
    2023-01-31
    Python
  • Python中弱引用怎么使用
    背景开始讨论弱引用( weakref )之前,我们先来看看什么是弱引用?它到底有什么作用?假设我们有一个多线程程序,并发处理应用数据:# 占用大量资源,创建销毁成本很高\ class Data:\ def __init__(self...
    99+
    2023-05-14
    Python
  • C 语言的弱符号与弱引用你了解吗
    目录C语言中的__attribute__((weak)) 与 attribute ((weakref())弱符号弱符号的作用与示例弱引用测试代码1:测试代码2:总...
    99+
    2022-11-13
  • PHP 弱引用的相关总结
    目录什么是弱引用WeakReference注意测试代码:之前的文章中,我们已经学习过引用和引用传值相关的知识。我们知道,PHP 中没有纯引用(指针),不管是对象,还是用引用符号 &a...
    99+
    2022-11-12
  • Python中弱引用的神奇用法与原理详解
    目录背景典型用法工作原理实现细节总结背景 开始讨论弱引用( weakref )之前,我们先来看看什么是弱引用?它到底有什么作用? 假设我们有一个多线程程序,并发处...
    99+
    2022-11-10
  • JavaScript中的弱引用和强引用是什么
    本篇内容介绍了“JavaScript中的弱引用和强引用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2022-10-19
  • Java中的弱引用有什么用
    这篇文章主要讲解了“Java中的弱引用有什么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的弱引用有什么用”吧!Java里一个对象obj被创建时,被放在堆里。当GC运行的时候,发...
    99+
    2023-06-15
  • java弱引用的理解与使用
    在Java里, 当一个对象被创建时, 它被放在内存堆里. 当GC运行的时候, 如果发现没有任何引用指向该对象, 该对象就会被回收以腾出内存空间。或者换句话说, 一个对象被回收, 必须满足两个条件: 1)没有任何引用指向它 (...
    99+
    2020-01-26
    java教程 java
  • Java中的强引用,软引用,弱引用,虚引用的作用介绍
    目录1.强引用( Strong Reference )2.软引用( Soft Reference )3.弱引用( Weak Reference )4.虚引用( PhantomRefe...
    99+
    2022-11-13
  • PHP中弱引用的示例分析
    这篇文章主要介绍PHP中弱引用的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php的框架有哪些php的框架:1、Laravel,Laravel是一款免费并且开源的PHP应用框架。2、Phalcon,Phal...
    99+
    2023-06-15
  • java强引用和弱引用有什么区别
    Java的引用分为四种:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Ref...
    99+
    2023-10-27
    java
  • JavaScript 弱引用强引用底层示例详解
    目录正文1. 弱引用2. 强引用3. JavaScript 的垃圾收集3.1 可达性4. Set VS WeakSet5. Map VS WeakMap6. WeakMap 的应用6...
    99+
    2022-11-13
    JavaScript 弱引用强引用 JavaScript 引用
  • 关于C语言中弱符号与弱引用的实际应用问题
    最近在学习《程序员的自我修养——链接、装载与库》时,get到了一个新的知识点:弱符号与弱引用。书中简短的介绍,让我了解到弱符号的含义以及使用方式。了解我的朋友,应该知道我喜欢将知识...
    99+
    2022-11-12
  • 十分钟理解Java中的弱引用
    本篇文章尝试从What、Why、How这三个角度来探索Java中的弱引用,帮助大家理解Java中弱引用的定义、基本使用场景和使用方法。由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指出,谢谢大家:)1. What——什...
    99+
    2023-06-02
  • Android利用软引用和弱引用避免OOM的方法
    想必很多朋友对OOM(OutOfMemory)这个错误不会陌生,而当遇到这种错误如何有效地解决这个问题呢?今天我们就来说一下如何利用软引用和弱引用来有效地解决程序中出现的OOM...
    99+
    2022-06-06
    方法 Android
  • Java内存泄漏知识(软引用、弱引用等)
    关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 未经允许不得转载 ...
    99+
    2023-10-22
    java 内存泄漏 弱引用 强引用 android
  • java中弱引用和软引用有什么区别
    java中弱引用和软引用有什么区别?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的...
    99+
    2023-06-14
  • 智能指针与弱引用详解
    在android 中可以广泛看到的template<typename T> class Sp 句柄类实际上是android 为实现垃圾回收机制的智能指针。智能指针是c++...
    99+
    2022-11-15
    智能指针 弱引用
  • 怎么在java中回收弱引用
    本篇文章给大家分享的是有关怎么在java中回收弱引用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java可以用来干什么Java主要应用于:1. web开发;2. Androi...
    99+
    2023-06-14
  • weakMap为什么是弱引用原理
    目录前言弱引用 vs 强引用Map vs WeakMap前言 聊一下WeakMap弱引用,看了很多文章发现说的不对,给出的demo经过尝试也是错误的,哎,难搞也要搞 弱引用 vs ...
    99+
    2023-02-10
    weakMap 弱引用 weakMap 弱引用原理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作