【问题标题】:making a python object unsable after a finalize-type call在 finalize 类型调用后使 python 对象不可用
【发布时间】:2011-03-09 21:21:48
【问题描述】:

我有一个 python 对象,它在系统上包装了一个敏感且重要的资源。我有一个cleanup() 函数,可以安全地释放对象使用的各种锁。

我想确保在调用cleanup() 之后对象变得不可用。理想情况下,对对象的任何成员函数的任何调用都会引发异常。有没有一种方法可以不涉及检查每个函数中的标志?

【问题讨论】:

  • 您是否在with 语句的上下文中使用它?你在使用上下文管理器协议吗?
  • 刚刚花了一些时间弄清楚我是否会在所有运行此代码的系统上至少安装 python 2.5,看起来我真的不能指望这一点。太糟糕了——这正是确保我没有杂散参考的正确方法。
  • “真的不能指望”?为什么不?让它成为一个要求。需要 Python 2.6 有什么问题?
  • 唉,主要的 linux 服务器发行版之一(RHEL 5 / CentOS 5)仍然附带 Python 2.4。在这些系统上升级 python 非常困难,它们是我正在为其编写软件的环境组合的一部分。
  • “非常难”?我们经常这样做。是什么让它“非常难”?我错过了一些隐藏的复杂性吗?

标签: python object resources destructor


【解决方案1】:

一种方法是简单地将所有实例变量设置为None。然后,做几乎任何事情都会导致 AttributeError 或 TypeError。一种更复杂的方法是用装饰器包装实例方法。装饰器可以检查关闭是否已被处理。如果是,则抛出异常:

class Unusable:
    def __init__(self):
        self.alive = True

    def notcleanedup(func):
        def operation(self, *args, **kwargs):
            if self.alive:
                func(self, *args, **kwargs)
            else:
                raise Exception("Use after cleanup")

        return operation

    @notcleanedup
    def sensitive(self, a, b):
        print a, b

    def cleanup(self):
        self.alive = False

【讨论】:

    猜你喜欢
    • 2021-05-26
    • 2021-02-23
    • 2014-12-25
    • 2017-02-19
    • 2013-05-05
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多