Identical descriptor value, without leaking memory?

Ian Kelly ian.g.kelly at gmail.com
Fri Jul 29 19:01:04 EDT 2011


On Mon, Jul 25, 2011 at 11:46 AM, Jack Bates <ms419 at freezone.co.uk> wrote:
> How can you get a descriptor to return an identical value, each time
> it's called with the same "instance" - without leaking memory?

class MyDescriptor(object):
    def __get__(self, instance, owner):
        try:
            return instance.__cached_value[self]
        except AttributeError:
            instance.__cached_value = {self: get_value(instance, owner)}
        except KeyError:
            instance.__cached_value[self] = get_value(instance, owner)
        return instance.__cached_value

class MyClass(object):
    my_attribute = MyDescriptor()


Placing the cache on the object instance ensures that it won't outlive
the object, and since the full attribute name will be
_MyDescriptor__cached_value, it's highly unlikely to conflict with an
existing attribute.  Keying the value on self is necessary in case the
object has multiple descriptors of the same type.



More information about the Python-list mailing list