我想要一个在初始化时检查是否存在filename
的类。如果是,它应该用filename
初始化自己,否则它应该运行init。稍后我可以运行save
方法,保存整个对象。
我想要的草图:
class data(object):
def __init__(self, filename):
if does_not_exist(filename): # create new
[... expensive computations]
self.save(filename)
else: # load existing
with open(filename,'rb') as fp:
self = pickle.load(fp)
def save(self, filename):
with open(filename,'wb') as fp:
pickle.dump(self, fp)
加载时我知道我可以做
之类的事情tmp = pickle.load(fp)
self.a = tmp.a
self.b = tmb.b
...
但我希望有更好的方法
我认为之前已经问过这个问题,但找不到它:/
答案 0 :(得分:2)
在self
内分配给__init__
是没有意义的,因为您并未修改self
指向的对象 - 您只是绑定变量名{ {1}}函数中的另一个对象。
您可以使用self
或staticmethod
来执行缓存中的可选加载:
classmethod
现在,使用class Data(object):
@classmethod
def init_cached(cls, filename):
if not os.path.exists(filename): # create new
result = cls(filename)
result.save(filename)
return result
else:
with open(filename, 'rb') as fp:
return pickle.load(fp)
def __init__(self, filename):
pass # [... expensive computations]
代替Data.init_cached()
来初始化您的对象。
更奇特的方法是覆盖Data()
以实现相同的目的,但是Data.__new__()
的初始化透明地检查缓存版本是否存在:
Data()