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