据我了解,__del__
Python 类的函数并没有像很多人想象的那样受到对待: 作为析构函数。
我也知道有更多“Pythonic”并且可以说是更优雅的整理方式,特别是使用与构造.
然而,当编写可能被不熟悉 python 方式的读者使用的代码时,当清理很重要时,是否有一种优雅的方法可以简单地得到__del__
可靠地作为析构函数工作,而不干扰 python 的自然使用__del__
?
期望__del__
行为似乎不像析构函数不合理同时也很常见。所以我只是想知道是否有一种优雅的方式让它按照预期工作——忽略关于它的 Python 优点的许多争论。
如果你明白这一切,为什么不以 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__
and __exit__
方法,只需调用cleanup
in __exit__
(如上所述的“手动清理”)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)