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