python - __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
呢?
解决方案
正如您所展示的,您可以使用参数定义方法。__del__
如果您自己调用该方法,您可以传入一个值,就像您可以使用任何其他方法一样。但是当解释器调用__del__
自己时,它不会传递任何东西,并且会引发异常。
然而,由于__del__
方法经常在不稳定的情况下被调用,比如当解释器关闭时,如果引发异常,Python 不会停止一切。相反,它只是打印出它忽略了异常并继续做它已经在做的事情。这就是为什么当您的对象d
和c
对象被清理时,您会看到两条“忽略异常”消息。
我不清楚您实际上希望您的__del__
方法如何处理n
您传入的值。您的示例是一个微不足道的案例,通常在那里您无能为力。__del__
实际上,为类编写方法很少是一个好主意。有更好的资源分配方法,例如上下文管理器协议(使用__enter__
和__exit__
方法)。
推荐阅读
- javascript - 从 VueJS 中的全局事件总线访问事件对象
- kubernetes - 在 windows 上安装 minikube
- git - 如何使用 gitlab 对 git clone 进行身份验证
- gstreamer - 管道未完成从 READY 到 PAUSED 的转换
- javascript - 我怎么能用一个数据绑定来调用 2 个函数?
- javascript - 在 Datetime 中禁用今天的日期
- oracle - 在视图创建中使用关键字 FORCE 有什么好处?
- javascript - Node.js 和事件循环
- reactjs - 填充redux存储后React组件未更新
- python - 如何在不提示授权我的脚本的情况下设置对 Google 表格的身份验证?