gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:54:21 25 4
gpt4 key购买 nike

据了解,__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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com