The untimely dimise of a weak-reference

Peter Otten __peter__ at web.de
Fri Jul 30 09:06:00 EDT 2010


Vincent van Beveren wrote:

> Hi everyone,
> 
> I was working with weak references in Python, and noticed that it was
> impossible to create a weak-reference of bound methods. Here is a little
> python 3.0 program to prove my point:
> 
> import weakref
> 
> print("Creating object...")
> class A(object):
>     
>     def b(self):
>         print("I am still here")
>         
> a = A()
> 
> def d(r):
>     print("Aaah! Weakref lost ref")
> 
> print("Creating weak reference")
> 
> r = weakref.ref(a.b, d)

The instance doesn't keep a reference of its bound method. Rather the bound 
method keeps a reference of its instance. Every time you say

a.b

you get a different bound method. What do you think should keep it alive?

 
> print("Oh, wait, its already gone!")
> print("Ref == None, cause of untimely demise: %s" % r())
> print("Object is still alive: %s" % a)
> print("Function is still exists: %s" % a.b)
> print("See:")
> a.b()
> 
> I also tried this in Python 2.5 and 2.6 (with minor modifications to the
> syntax of course), and it yielded the exact same behavior. Why is this,
> and is there anything I can do about it? I wish to reference these bound
> functions, but I do not want to keep them in memory once the object they
> belong to is no longer referenced.

I fear you have to manage the methods' lifetime explicitly.

Peter



More information about the Python-list mailing list