社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python使用self回调后如何“释放”对象

Andreas Otto • 4 年前 • 781 次点击  

请检查以下代码

class Client(MqC):                                                                                                 

  def __init__(self, tmpl=None):                                                                                   
    self.ConfigSetBgError(self.BgError)                                                                          
    MqC.__init__(self)                                                                                             

  def BgError(self):                                                                                               
    ... do some stuff……

我可以添加回拨 BgError 作为类或作为对象回调

  1. 类= self.ConfigSetBgError(Client.BgError)
  2. 对象= self.ConfigSetBgError(self.BgError)

这两种情况都有效,因为回调代码可以处理

问题是 再计数 自己 对象-案例(2)增加 再计数 通过 所以下面的代码显示了不同的代码

cl = Client()
print("refCount=" + str(sys.getrefcount(cl)))
cl = None
  1. .tp_dealloc 是因为 refCount=2
  2. TP-脱氧 不是 打电话是因为 refCount=3

如何解决这个问题 再计数 清理问题?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43099
 
781 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Martijn Pieters
Reply   •   1 楼
Martijn Pieters    5 年前

如果您担心回调会使实例保持活动状态,那么 不要传入绑定方法 . self.BgError 创建方法对象(通过 descriptor protocol ,它引用实例对象,因为在调用该实例时它需要访问该实例;这就是 self 首先传入参数。

如果不需要引用实例状态,并且回调API可以处理未绑定的方法、类方法或静态方法,则将其中一个方法传入。

例如,您可以 BgError 类方法或静态方法:

@classmethod
def BgError(cls):
    # ...

现在两个 Client.BgError 自错 ( instance_of_Client.BgError )生成绑定到类而不是实例的方法对象,从而提供一致的行为。没有对实例进行额外的引用。

如果您确实需要实例状态,请使用 weak reference 以你为例。调用时,请在使用实例之前检查弱引用是否仍然可用。也看到 using python WeakSet to enable a callback functionality 有关回调和弱引用的更深入的帖子。在那里,回调注册表负责生成和存储弱引用,但同样的原则也适用。