栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

如果您了解所有这些内容,为什么不以Pythonic的方式来做呢?比较另一个需要清除的类:

tempfile.TemporaryDirectory

with TemporaryDirectory() as tmp:    # ...# tmp is deleteddef foo():    tmp = TemporaryDirectory()foo()# tmp is deleted

他们如何做到这一点?这是相关的位:

import weakrefclass 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__
方法是很简单的,只需调用
cleanup
in
__exit__
(如上所述的“手动清理”)即可。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/516963.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号