首页 > 解决方案 > __del__() 除了 self 之外还有 args

问题描述

我有一个 Python 程序如下:

class a:
    def __init__(self,n):
        self.n=n
    def __del__(self,n):
        print('dest',self.n,n)
def b():
    d=a('d')
    c=a('c')
    d.__del__(8)
    
b()

在这里,我给出了一个参数n__del__()清除我的疑问。它的输出:

$ python des.py 
dest d 8
Exception ignored in: <function a.__del__ at 0xb799b074>
TypeError: __del__() missing 1 required positional argument: 'n'
Exception ignored in: <function a.__del__ at 0xb799b074>
TypeError: __del__() missing 1 required positional argument: 'n'

在像 C++ 这样的经典编程语言中,我们不能为析构函数提供参数。要知道它是否也适用于 python,我已经执行了这个程序。为什么解释器允许将参数n作为析构函数的参数给出?那我该如何指定值n呢?作为一个尝试给出一个论点__del__(),它很顺利。但是没有它我怎么能指定值n呢?

标签: pythondestructor

解决方案


正如您所展示的,您可以使用参数定义方法__del__如果您自己调用该方法,您可以传入一个值,就像您可以使用任何其他方法一样。但是当解释器调用__del__自己时,它不会传递任何东西,并且会引发异常。

然而,由于__del__方法经常在不稳定的情况下被调用,比如当解释器关闭时,如果引发异常,Python 不会停止一切。相反,它只是打印出它忽略了异常并继续做它已经在做的事情。这就是为什么当您的对象dc对象被清理时,您会看到两条“忽略异常”消息。

我不清楚您实际上希望您的__del__方法如何处理n您传入的值。您的示例是一个微不足道的案例,通常在那里您无能为力。__del__实际上,为类编写方法很少是一个好主意。有更好的资源分配方法,例如上下文管理器协议(使用__enter____exit__方法)。


推荐阅读