我想编写一个使用单例模式的类来提供一些持久化的数据存储,使用泡菜/dict:
@singleton
class Pdb:
def __init__(self):
self.cache = None
self.dirty = False
try:
with open("data.pck","rb") as fp:
self.cache = pickle.load(fp)
except FileNotFoundError:
pass
except pickle.PickleError:
pass
if self.cache is None:
self.cache = {}
def flush(self):
if self.dirty:
try:
with open("data.pck","wb") as fp:
pickle.dump(self.cache,fp,protocol=4)
except pickle.PickleError:
pass
else:
self.dirty = False
def __del__(self): # PROBLEM HERE
self.flush()当我使用python 2时,我可以通过重写__del__来完成它。但在python 3中,这似乎是不正确的。我怎么做呢?
如果通过"with“语句执行此操作,则需要将实例传递给我调用的每个函数:
def func1(db):
db.set(...)
func3(db,x1,x2,...)
with Pdb() as db:
func1(db)
func2(db)这很复杂。有没有一种“用”语句来做全局范围的pythonic方法?
发布于 2016-07-07 06:36:31
如果通过"with“语句执行此操作,则需要将实例传递给我调用的每个函数:
不,你不需要。就用你的单身人士:
# global
db = Pdb()
# any other context
with db:所需要的就是表达式生成一个上下文管理器。使用__enter__和__exit__方法引用单个对象将满足这一要求。您甚至可以忽略__enter__返回值,就像我前面所做的那样。全局仍然对所有函数可用,唯一改变的是将在适当的位置调用__enter__和__exit__。
注意,即使在Python2中,您也应该而不是依赖于调用__del__。在CPython实现中,除了循环引用之外,调用__del__的规则在Python2和3之间没有改变。
https://stackoverflow.com/questions/38238778
复制相似问题