您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何确保通常(但错误地)期望在Python类上调用__del__函数?

如何确保通常(但错误地)期望在Python类上调用__del__函数?

如果您了解所有这些内容,为什么不以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在对象被垃圾回收时触发,或者在程序结束时(如果它仍在周围)触发。我们可以保留finalizer,以便可以明确杀死对象(使用detach)并将其标记为死对象,以便不调用finalizer(当我们要手动处理清理操作时)。

如果您想使用来支持上下文用法with,那么添加__enter____exit__方法是很简单的,只需调用cleanupin__exit__(如上所述的“手动清理”)即可。

python 2022/1/1 18:46:34 有474人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶