过于复杂的 __del__
方法¶
ID: py/overly-complex-delete
Kind: problem
Security severity:
Severity: recommendation
Precision: high
Tags:
- efficiency
- maintainability
- complexity
- statistical
- non-attributable
Query suites:
- python-security-and-quality.qls
__del__
方法用于在对象被删除时释放对象持有的任何资源。只有垃圾收集器才会调用 __del__
,它可能在无限延迟后调用,也可能永远不会调用。
因此,不应依赖 __del__
方法来释放资源,例如文件描述符。相反,应显式释放这些资源。
存在复杂的 __del__
方法表明这是释放与对象关联的资源的主要或唯一方法。
建议¶
为了确保正确清理对象,请添加一个显式的 close() 方法或类似的方法。可能需要将对象设置为上下文管理器。
del 方法应该只调用 close()
示例¶
下面的第一个示例显示了一个依赖 __del__
来释放资源的类。第二个示例显示了该类的改进版本,其中 __del__
只是调用 close。
#Relies on __del__ being called by the garbage collector.
class CachedPreferencesFile
...
def __del__(self):
for key, value in self.preferences.items():
self.write_pair(key, value)
self.backing.close()
#Better version
class CachedPreferencesFile
...
def close(self):
for key, value in self.preferences.items():
self.write_pair(key, value)
self.backing.close()
def __del__(self):
self.close()
参考¶
Python 标准库:上下文管理器.