我有一些构建数据结构的方法(例如,从一些文件内容中):
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
每次你做任何事情的时候。