我有一些构建数据结构的方法(例如,从一些文件内容中):def loadfile(FILE):
return # some data structure created from the contents of FILE
所以我可以像puppies = loadfile("puppies.csv") # wait for loadfile to work
kitties = loadfile("kitties.csv") # wait some more
print len(puppies)
print puppies[32]
在上面的示例中,我浪费了大量时间来实际读取kitties.csv,并创建一个从未使用过的数据结构。我想避免这种浪费,而不需要在我想做某事的时候经常检查if not kitties。我希望能做到puppies = lazyload("puppies.csv") # instant
kitties = lazyload("kitties.csv") # instant
print len(puppies) # wait for loadfile
print puppies[32]
所以如果我不想对kitties做任何事情,loadfile("kitties.csv")永远不会被调用。
有什么标准方法可以做到这一点吗?
经过一段时间的尝试,我提出了下面的解决方案,它看起来工作正常,而且非常简短。有其他选择吗?我应该记住使用这种方法有什么缺点吗?class lazyload:
def __init__(self,FILE):
self.FILE = FILE
self.F = None
def __getattr__(self,name):
if not self.F:
print "loading %s" % self.FILE
self.F = loadfile(self.FILE)
return object.__getattribute__(self.F, name)
更妙的是,如果这样做奏效:class lazyload:
def __init__(self,FILE):
self.FILE = FILE
def __getattr__(self,name):
self = loadfile(self.FILE) # this never gets called again
# since self is no longer a
# lazyload instance
return object.__getattribute__(self, name)
但这不起作用,因为self是本地的。实际上,每次你做任何事情,它都会给loadfile打电话。