[Python-3000] weakrefs and cyclic references
tomer filiba
tomerfiliba at gmail.com
Fri Jun 2 14:54:21 CEST 2006
dang, you posted before me :)
anyway, please check my implementation as well
http://sebulba.wikispaces.com/recipe+weakattr
i also included some demos.
anyway, i'd like to have this or the other weakattr implementation
included in weakref.py. it's a pretty useful feature to have in the stdlib,
for example:
from weakref import weakattr
class blah(object):
someattr = weakattr()
def __init__(self):
self.someattr = self
just like properties.
-tomer
On 6/2/06, Nick Coghlan <ncoghlan at gmail.com> wrote:
> Greg Ewing wrote:
> > What might be useful is an easier way of *explicitly*
> > creating and using weak references.
> >
> > We already have WeakKeyDictionary and WeakValueDictionary
> > which behave just like ordinary dicts except that they
> > weakly reference things. I'm thinking it would be nice
> > to have a way of declaring any attribute to be a weak
> > reference. Then it could be read and written it in the
> > usual way, without all the code that uses it having
> > to know about its weakness.
> >
> > This could probably be done fairly easily with a suitable
> > property descriptor.
>
> Something like the following? (although you could do a simpler version without
> the callback support) (untested!)
>
> class WeakAttr(object):
> """Descriptor to define weak instance attributes
>
> name is the name of the attribute
> callback is an optional callback function
>
> If supplied, the callback function is called with the
> instance and the attribute name as arguments after a currently
> referenced object is finalized.
> """
> def __init__(self, name, callback=None):
> self._name = name
> self._callback = callback
>
> def __get__(self, obj, cls):
> if obj is None:
> return self
> attr_ref = getattr(obj, self._name)
> if attr_ref is not None:
> return attr_ref()
> return None
>
> def __set__(self, obj, value):
> name = self._name
> if value is None:
> setattr(obj, name, None)
> else:
> cb = self._callback
> if cb is not None:
> _cb = cb
> def cb(dead_ref):
> if dead_ref is getattr(obj, name):
> # Object that went away is still
> # the one referred to by the
> # attribute, so invoke the callback
> _cb(obj, name)
> attr_ref = weakref.ref(value, cb)
> setattr(obj, self._name, )
>
> def __delete__(self, obj):
> delattr(obj, self._name)
>
>
>
>
> --
> Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
> ---------------------------------------------------------------
> http://www.boredomandlaziness.org
>
More information about the Python-3000
mailing list