python - 覆盖 Python 析构函数 (__del__) 会导致内存泄漏吗?
问题描述
我有一个脚本,我在其中使用 API 在云上创建一个对象,并希望在某些情况下在脚本末尾删除它。
class ObjCreator():
def __init__(self, keep_object: bool):
self.keep_object = keep_object
print("init")
def create_object(self):
print("Created object using API")
def delete_object(self):
print("Deleting object using API")
def __del__(self):
print("Deleting object using API only if keep_object is False")
if not self.keep_object:
self.delete_object()
我在 Python 程序上看到了一些内存泄漏,所以显然 GC 不是完美的(即无法收集的对象)。
我担心重写del函数会导致内存泄漏。那可能吗?如果是这样,您对不同的优雅解决方案有什么建议吗?
解决方案
您的直觉是正确的,覆盖该__del__
方法意味着__del__
不再自动调用基类的方法(尽管我认为这里不太可能发生内存泄漏)。事实上,文档明确提到了这一点:
如果基类具有 __del__() 方法,则派生类的 __del__() 方法(如果有)必须显式调用它以确保正确删除实例的基类部分。
CPython repo 中的代码示例:
def __del__(self):
# ... your cleanup code here ...
super().__del__() # call to base class
推荐阅读
- python - 如何将来自 xarray 中不同数据集的两个变量相加,同时确保仅对具有相同坐标和时间的数据求和?
- python-3.x - 数据框在子功能中被覆盖
- database - 在规范化方面,是否有必要在传递依赖之前去除部分依赖?解释你的观点
- javascript - 如何摆脱警告'类型......不可分配给类型'打字稿
- web-services - 我们如何使用面向服务的架构来自动化金融科技解决方案的应用程序流程?
- javascript - 我们如何使用 node js 中的 pm2 api 显示 pm2 应用程序的最新日志?
- pytorch - pytorch 中的 Tensorboard 不会在浏览器中加载任何内容
- android - 如何检查哪个图像是按钮的源图像并在每次单击 Kotlin 中的按钮时更改它
- android - ActivityViewModels 和惰性 ViewModelProvider 的区别?
- python - AttributeError: 'str' 对象没有属性 'read' 。打印时出错(filename.read())