对象销毁期间缺少对 __del__
的调用¶
ID: py/missing-call-to-delete
Kind: problem
Security severity:
Severity: error
Precision: high
Tags:
- efficiency
- correctness
Query suites:
- python-security-and-quality.qls
与 Java 等静态类型语言不同,Python 允许在对象销毁期间完全自由地调用方法。但是,标准的面向对象原则适用于使用深度继承层次结构的 Python 类。因此,开发人员有责任确保在需要调用多个 __del__
方法时,对象被正确清理。
如果在对象销毁期间未调用超类的 __del__
方法,则很可能导致资源泄漏。
在对象销毁期间,可能会省略对超类的 __del__
方法的调用
当子类调用错误类的
__del__
方法时。当省略对一个或多个基类的
__del__
方法的调用时。
建议¶
要么注意显式调用正确基类的 __del__
,要么在整个继承层次结构中使用 super()
。
或者重构一个或多个类以使用组合而不是继承。
示例¶
在此示例中,使用了对 __del__
的显式调用,但 SportsCar
错误地调用了 Vehicle.__del__
。通过在 FixedSportsCar
中调用 Car.__del__
,修复了此问题。
class Vehicle(object):
def __del__(self):
recycle(self.base_parts)
class Car(Vehicle):
def __del__(self):
recycle(self.car_parts)
Vehicle.__del__(self)
#Car.__del__ is missed out.
class SportsCar(Car, Vehicle):
def __del__(self):
recycle(self.sports_car_parts)
Vehicle.__del__(self)
#Fix SportsCar by calling Car.__del__
class FixedSportsCar(Car, Vehicle):
def __del__(self):
recycle(self.sports_car_parts)
Car.__del__(self)
参考资料¶
Python 教程:类.
Python 标准库:super.
Artima 开发者:关于 Python Super 的一些知识.
维基百科:组合优于继承.