weak reference to bound method
Peter Otten
__peter__ at web.de
Fri Oct 2 05:58:23 EDT 2009
Ole Streicher wrote:
> Hi Thomas,
>
> Thomas Lehmann <t.lehmann at rtsgroup.net> writes:
>>> r = weakref.ref(o.myfunc)
>>> print r()
>>> >>>> None
>> k = o.myfunc
>> r = weakref.ref(k)
>> print r()
>>>>>>> <weakref at 00B80750; to 'method' at 00B59918 (myfunc)>
>
>> Don't ask me why! I have just been interested for what you are trying...
>
> This is clear: in your case, o.myfunc is explicitely referenced by k,
> this avoids the garbage collection.
>
> My problem is that I have a class that delegates a function call, like:
>
> --------------------8<------------------
> import weakref
>
> class WeakDelegator(object):
> def __init__(self, func):
> self._func = weakref.ref(func)
>
> def __call__(self):
> func = self._func()
> return func() if func else None
> --------------------8<------------------
>
> This does not work for bound methods because the weak reference to a
> bound method will always point to None, even if the object still exists.
>
> Why is that the case and how can I implement such a class properly?
Maybe:
from weakref import ref
class A(object):
def f(self): return "f"
class Method(object):
def __init__(self, obj, func=None):
if func is None:
func = obj.im_func
obj = obj.im_self
self._im_self = ref(obj)
self._im_func = ref(func)
def __call__(self):
obj = self._im_self()
func = self._im_func()
if obj is not None and func is not None:
return func.__get__(obj)()
a = A()
m = Method(a.f)
print m()
del a
print m()
It's still not clear to me why you would want to do that...
Peter
More information about the Python-list
mailing list