If you wanted to avoid the __getattr__ __setattr__ speed hit, something like this would work. However, you have to not mind calling a function to get the data, instead of only getting the attribute:
class Cache(object): _cache = {} def __init__(self, filename): self.filename = filename def Get(self): obj = self._cache.get(self.filename, None) if not obj: obj = self._cache[self.filename] = Load(self.filename) return obj @staticmethod def Clear(): print "\nClearing cache\n" Cache._cache = {} class Sprite(Cache): def Draw(self): print self.Get() class Sound(Cache): def Play(self): print self.Get() def Load(filename): print "********** Open '%s' here" % filename suffix = filename.lower()[-3:] if suffix in ['png', 'bmp', 'jpg', 'tif']: tag = 'Image' elif suffix in ['wav', 'mp3']: tag = 'Sound' return "%s data from %s" % (tag, filename) def main(): sprite1 = Sprite('data/pic_1.png') sprite2 = Sprite('data/pic_2.png') sound1 = Sound('data/sound_22.wav') sprite1.Draw() sprite2.Draw() sound1.Play() sprite1.Draw() sprite2.Draw() sound1.Play() Cache.Clear() sprite1.Draw() sprite2.Draw() sound1.Play() sprite1.Draw() sprite2.Draw() sound1.Play() main() -- http://mail.python.org/mailman/listinfo/python-list