python - 在 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 仍然可用?
解决方案
终结器__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()
推荐阅读
- python - 使用字典将列表转换为数据框
- python - 重命名熊猫中的列值
- cmd - 我可以创建在 cmd 中使用的简写名称吗?
- c++ - UWP C++:只写入而不是读取全局变量?
- windows - 使用 mingw32-make 安装 RSEM 时,MinGW 找不到我安装的 zlib.h 和 zlib 文件
- heatmap - 如何下载网格化 sst 数据?
- database - laravel 一对多关系返回 null
- javascript - Selenium:如何检查第二个选项卡是否已完全加载
- c++ - 函数标识符未定义 C++
- python - 如何使用 Pyserial 检测串行端口是否正在被另一个应用程序使用?