Help Understanding weakref (lazyloader)
Ripter
Ripter001 at gmail.com
Wed Sep 3 23:04:22 EDT 2008
On Sep 3, 10:46 pm, Ripter <Ripter... at gmail.com> wrote:
> I found this script athttp://www.pygame.org/wiki/LazyImageLoading?parent=CookBook
> And I can't quite figure out how it works. I was wondering if someone
> could clarify it for me.
> The Code is:
>
> import pygame
> import weakref
>
> class ResourceController(object):
> def __init__(self, loader):
> self.__dict__.update(dict(
> names = {},
> cache = weakref.WeakValueDictionary(),
> loader = loader
> ))
>
> def __setattr__(self, name, value):
> self.names[name] = value
>
> def __getattr__(self, name):
> try:
> img = self.cache[name]
> except KeyError:
> img = self.loader(self.names[name])
> self.cache[name] = img
> return img
>
> class ImageController(ResourceController):
> def __init__(self):
> ResourceController.__init__(self, pygame.image.load)
>
> My question is why does the __setattr__ set the value to
> self.names[name] instead of self.cache[name]?
I feel stupid, I figured it out. (Don't program while watching Back to
the Future)
The reason would be the 'lazy' part. self.names holds the file name,
and when you get the property back (__getattr__) it checks to see if
it already got the value or not, and uses the name to get the value if
it hasn't already.
Duh. Sorry.
More information about the Python-list
mailing list