首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有" with“语句的python3单例模式

带有" with“语句的python3单例模式
EN

Stack Overflow用户
提问于 2016-07-07 06:28:34
回答 1查看 1.4K关注 0票数 0

我想编写一个使用单例模式的类来提供一些持久化的数据存储,使用泡菜/dict:

代码语言:javascript
复制
@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“语句执行此操作,则需要将实例传递给我调用的每个函数:

代码语言:javascript
复制
def func1(db):
    db.set(...)
    func3(db,x1,x2,...)

with Pdb() as db:
    func1(db)
    func2(db)

这很复杂。有没有一种“用”语句来做全局范围的pythonic方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-07 06:36:31

如果通过"with“语句执行此操作,则需要将实例传递给我调用的每个函数:

不,你不需要。就用你的单身人士:

代码语言:javascript
复制
# global
db = Pdb()

# any other context
with db:

所需要的就是表达式生成一个上下文管理器。使用__enter____exit__方法引用单个对象将满足这一要求。您甚至可以忽略__enter__返回值,就像我前面所做的那样。全局仍然对所有函数可用,唯一改变的是将在适当的位置调用__enter____exit__

注意,即使在Python2中,您也应该而不是依赖于调用__del__。在CPython实现中,除了循环引用之外,调用__del__的规则在Python2和3之间没有改变。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38238778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档