The untimely dimise of a weak-reference

Vincent van Beveren V.vanBeveren at rijnhuizen.nl
Fri Jul 30 10:06:17 EDT 2010


Hi Peter,

I did not know the object did not keep track of its bound methods. What advantage is there in creating a new bound method object each time its referenced? It seems kind of expensive.

Regards,
Vincent

-----Original Message-----
From: Peter Otten [mailto:__peter__ at web.de] 
Sent: vrijdag 30 juli 2010 15:06
To: python-list at python.org
Subject: Re: The untimely dimise of a weak-reference

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