首页 > 解决方案 > 在 del 方法中找不到 Python 的 datetime 模块

问题描述

为什么导入的模块在 Python 析构函数(__del__方法)中不可用?它可以通过某种方式提供吗?

例如,__del__在解释器关闭期间调用以下命令失败:

import datetime as datetime

class A:
    def __init__(self):
        self.start = datetime.now()
    def __del__(self):
        self.end = datetime.now()

a = A()

日期时间在构造函数中可用,而在调用析构函数时不可用。可能模块现在已经清理了,但是有什么方法可以确保 datetime 仍然可用?

标签: pythonpython-3.xdestructor

解决方案


终结器__del__方法可以在特殊情况下调用,因此不应对其环境做出假设。具体来说,在解释器关闭期间,模块的全局命名空间被清除以中断引用循环——__del__因此不能依赖导入的模块可用。

object.__del__(self)

  • __del__()可以在解释器关闭期间执行。因此,它需要访问的全局变量(包括其他模块)可能已经被删除或设置为None. […]

要保持所需的全局数据处于活动状态,__del__应将这些重新绑定为参数默认值。这意味着全局模块引用在方法定义上被解析,然后作为本地默认值保存。只要函数本身存在,这种重新绑定的数据就会存在。

import datetime as datetime

class A:
    def __init__(self):
        self.start = datetime.now()
    # local reference vvvvvvvv vvvvvvvv global reference
    def __del__(self, datetime=datetime):
        self.end = datetime.now()

推荐阅读