![](/img/trans.png)
[英]How to pass arguments to the metaclass from the class definition in Python 3.x?
[英]Python 3.x: How to save and load data from within a class
我想要一个在其初始化中检查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
...
但我希望有更好的方法
我认为这个问题以前曾被问过,但是找不到它:/
在__init__
为self
赋值是没有意义的,因为您没有修改self
指向的对象,而是将函数中的变量名称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()
进行初始化将透明地检查是否存在缓存的版本:
class Data(object):
def __new__(cls, filename):
if not os.path.exists(filename): # create new
return super(Data, cls).__new__(cls, filename, _save=True)
else:
with open(filename, 'rb') as fp:
return pickle.load(fp)
def __init__(self, filename, _save=False):
# [... expensive computations]
if _save:
self.save(filename)
进一步阅读: Python对__new__
和__init__
的使用?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.