【发布时间】:2009-11-04 12:25:47
【问题描述】:
我正在尝试存储一些方法回调,但引用它会使绑定的对象保持活动状态,所以我尝试为方法保留一个弱引用,但这似乎不可能?
所以
为什么我不能保留一个弱参考。 to 方法(参见下面的示例)
保持方法引用的最佳方式是什么?标准库中有什么东西吗?否则我将不得不保留函数和对象引用。分开?
示例:
import weakref
class A(object):
def m(self): pass
a = A()
import weakref
class A(object):
def m(self): pass
a = A()
rm = weakref.ref(a.m)
print "is weak ref to method dead?",rm() is None
print "Q1. why can't i keep weakref to bound method?"
ra = weakref.ref(a)
m = a.m
print "delete object"
del a
print "is object dead?",ra() is None
print "delete method"
del m
print "is object dead?",ra() is None
print "Q2. hmmm so i am stuck i can't keep a ref as it stops the object from gc, but weakref to method isn't working?"
【问题讨论】:
-
简单地从回调列表中删除对象以删除引用有什么问题?为什么不写一个
callback.remove(method)的“断开连接”方法? -
是的,这样做很好,但是当我存储回调时,我希望我可以弱引用它,这样如果有人忘记断开连接,它会自动断开连接,不会自动断开是一个更好的主意?
-
with块以确保断开连接有什么问题? -
如果可以在所有情况下使用'with'没有问题,回调的目的是将来某个时间在某些事件中,某些对象中的某些回调将被调用,我该如何适应'with'在这里?
标签: python methods weak-references