Prev: Builtn super() function. How to use it with multiple inheritance? And why should I use it at all?
Next: Basic Information about Python
From: Gregory Ewing on 30 Jul 2010 23:11
Vincent van Beveren wrote:
> I was working with weak references in Python, and noticed that it
> was impossible to create a weak-reference of bound methods.
> is there anything I can do about it?
You can create your own wrapper that keeps a weak reference to
the underlying object. Here's an example.
def __init__(self, bm):
self.ref = weakref.ref(bm.im_self)
self.func = bm.im_func
def __call__(self, *args, **kwds):
obj = self.ref()
if obj is None:
raise ValueError("Calling dead weak method")
self.func(obj, *args, **kwds)
if __name__ == "__main__":
print "foo method called on", self
a = A()
m = weakmethod(a.foo)
From: Vincent van Beveren on 2 Aug 2010 02:41
> You can create your own wrapper that keeps a weak reference to
> the underlying object. Here's an example.
Thanks for the code!
From: Vincent van Beveren on 2 Aug 2010 02:46
> Instances of a class have no means of storing the bound method object.
> The or unbound bound method is a simple and small wrapper that keeps a
> reference to the class, "self" and the function object. Python keeps a
> pool of empty method objects in a free list. The creation of a new bound
> method just takes a few pointer assignments and three INCREFs.
Okay, that also explains the consistent memory assignment. Maybe I'll create a bound-method caching object, see how slow/fast it is in comparison, and see what ever other issues I run into.
From: python-list-bounces+v.vanbeveren=rijnhuizen.nl(a)python.org [mailto:python-list-bounces+v.vanbeveren=rijnhuizen.nl(a)python.org] On Behalf Of Christian Heimes
Sent: vrijdag 30 juli 2010 16:44
Subject: Re: The untimely dimise of a weak-reference
Am 30.07.2010 16:06, schrieb Vincent van Beveren:
> 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.
From: Bruno Desthuilliers on 2 Aug 2010 05:10
Gregory Ewing a écrit :
> import weakref
> class weakmethod(object):
> def __init__(self, bm):
> self.ref = weakref.ref(bm.im_self)
> self.func = bm.im_func
> def __call__(self, *args, **kwds):
> obj = self.ref()
> if obj is None:
> raise ValueError("Calling dead weak method")
> self.func(obj, *args, **kwds)
Would be better with :
return self.func(obj, *args, *kwds)
From: Gregory Ewing on 3 Aug 2010 19:54
Bruno Desthuilliers wrote:
> Would be better with :
> return self.func(obj, *args, *kwds)
Thanks -- well spotted!