python - 如何确保 __del__ 函数像通常(但不正确)预期的那样在 Python 类上调用?

标签 python python-3.x python-2.7

据了解,__del__ Python 类的函数 is not treated in the way that many people might expect : 作为析构函数。

我也明白有更多的“pythonic”和可以说更优雅的整理方式,特别是使用 with construct .

然而,当编写可能被不太熟悉 Pythonic 方式的观众使用的代码时,当清理很重要时,是否有一种优雅的方式我可以简单地得到 __del__可靠地作为析构函数工作,而不会干扰 python 对 __del__ 的自然使用?

期望__del__作为析构函数的行为似乎并不合理,同时也很常见。所以我只是想知道是否有一种优雅的方式让它按照这个期望工作 - 无视关于它是多么pythonic的优点的许多辩论。

最佳答案

如果你理解所有这些,为什么不以 Pythonic 的方式来做呢?比较另一个清理很重要的类:tempfile.TemporaryDirectory .

with TemporaryDirectory() as tmp:
    # ...
# tmp is deleted

def foo():
    tmp = TemporaryDirectory()
foo()
# tmp is deleted

他们怎么做到的?这是相关的部分:
import weakref
class Foo():
    def __init__(self, name):
        self.name = name
        self._finalizer = weakref.finalize(self, self._cleanup, self.name)
        print("%s reporting for duty!" % name)

    @classmethod
    def _cleanup(cls, name):
        print("%s feels forgotten! Bye!" % name)

    def cleanup(self):
        if self._finalizer.detach():
            print("%s told to go away! Bye!" % self.name)

def foo():
    print("Calling Arnold")
    tmpfoo = Foo("Arnold")
    print("Finishing with Arnold")

foo()
# => Calling Arnold
# => Arnold reporting for duty
# => Finishing with Arnold
# => Arnold feels forgotten. Bye!

def bar():
    print("Calling Rocky")
    tmpbar = Foo("Rocky")
    tmpbar.cleanup()
    print("Finishing with Rocky")

bar()
# => Calling Rocky
# => Rocky reporting for duty!
# => Rocky told to go away! Bye!
# => Finishing with Rocky
weakref.finalize将触发 _cleanup当对象被垃圾收集时,或者在程序结束时(如果它仍然存在)。我们可以保留终结器,以便我们可以明确杀死对象(使用 detach )并将其标记为已死,因此不会调用终结器(当我们想要手动处理清理时)。

如果你想支持上下文使用 with ,添加 __enter__ 很简单和 __exit__方法,只需调用 cleanup__exit__ (如上所述的“手动清理”)。

关于python - 如何确保 __del__ 函数像通常(但不正确)预期的那样在 Python 类上调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51513386/

相关文章:

linux - Python SMTP 函数将 .txt 文件作为 .bin 文件类型发送

Python:获取 2d 列表中前 4 个最高值

Python urllib2 读取错误

python-3.x - AttributeError: 模块 'sklearn.datasets' 没有属性 'load_titanic'

python 2.7 : Appending to a list value of a dictionary key

python - 查找第一个元素等于第二个元素加一的元组

python - 将一列的值分成两列

python - Pandas 绘图具有正值一种颜色和负值另一种颜色

python - 如何找到字符串中的第三个 ".",然后更改其后面字符的值

python - 如何在对象实例中保存当前状态?