python - del self vs self.__del__() - 在 python 中清理的正确方法是什么?

标签 python python-2.7 python-3.x self code-cleanup

我有一个包含类的 python 脚本。

这个类有一个 __del__ 方法用于通常的清理。如果我在脚本的正常执行期间删除了该类,我希望进行一些清理工作。

我还有一个信号处理程序,它会执行一些不寻常的清理工作。如果脚本在收到信号时正在执行其他操作,则需要进行一些额外的清理,然后再进行常规清理。

我注意到 del selfself.__del__() 之间存在差异。

self.__del__() 调用了 del 方法两次。

您能解释一下为什么会这样吗?

这是一个用于说明问题的模型脚本:

import sys
import signal
from optparse import OptionParser


class TestClass(object):
    def __init__(self,
                 del_self):
        self.del_self = del_self

        print "__init__ with del_self = %s" % self.del_self

    def __del__(self):
        print "Now performing usual cleanup."

    def signal_handler(self, arg_1, arg_2):
        print "Received signal. Now performing unusual cleanup."

        # Unusual cleanup

        print "Did unusual cleanup"

        if self.del_self:
            print("Doing del self")
            del self
        else:
            print("Doing self.__del__()")
            self.__del__()

        sys.exit(0)


if __name__ == '__main__':
    arguments = sys.argv[1:]
    parse = OptionParser("Test.")
    parse.add_option(
        "-d",
        "--delself",
        help="Set del self.",
        type="int",
        default=1
    )

    (options, _) = parse.parse_args()

    print "Options: %s" % options

    tc = TestClass(del_self=options.delself)

    signal.signal(signal.SIGQUIT, tc.signal_handler)

    while True:
        pass

如果我运行脚本:

python deltest.py --delself 1

然后发出 killall -3 python 我得到:

Received signal. Now performing unusual cleanup.
Did unusual cleanup
Doing del self
Now performing usual cleanup.

如果我再次执行 python deltest.py --delself 0 然后是终止信号,我会得到:

Received signal. Now performing unusual cleanup.
Did unusual cleanup
Doing self.__del__()
Now performing usual cleanup.
Now performing usual cleanup.

为什么在这种情况下__del__ 方法执行了两次?

谢谢!

最佳答案

del self 几乎什么都不做——它只删除名为 self局部变量。但由于这不是对该实例的最后一次引用(无论调用什么方法,至少它仍然有一个引用)该对象将继续存在。

手动调用 __del__ 除了运行该方法外也没有任何效果;它不会删除任何内容。

的工作是删除对对象的最后引用:在这种情况下,main 方法中的 del tc 会删除最后的引用,据我所知可以看到。然后该对象将被垃圾回收,然后 Python 调用 __del__

所以这就是为什么 __del__ 会发生两次:一次是当您将它作为一个普通函数手动调用时,另一次是在程序结束时对象被垃圾回收。

关于python - del self vs self.__del__() - 在 python 中清理的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41765687/

相关文章:

python - 如何使用文件中的随机代理/UA 制作 annonimizer?

python - 在 python 中使用 lambda 函数创建差异数组

python - SqlAlchemy 当前数据库用户

python-2.7 - Python PieChart(是否可以做CallOut标签)

python - 如何按顺序比较列表中的项目?

python-3.x - 如何在 Google Colab 笔记本中解压缩非常大的 zip 文件(>6gb)?

python - 使用 python 进行 Elastic Search 批量更新,如何使用新数据追加数组字段

python - Django 管理员 : exclude field on change form only

python - 我应该如何通过函数传递 matplotlib 对象;作为 Axis、Axes 还是 Figure?

python - 如何让下面的快速排序更加 'pythonic'