__del__上的Python attributeError

__del__上的Python attributeError,第1张

__del__上的Python attributeError

您的

__del__
方法假定该类在被调用时仍然存在。

这个假设是不正确的。

Groupclass
当您的Python程序退出时,已被清除,现在设置为
None

测试是否仍然首先存在对该类的全局引用

def __del__(self):    if Groupclass:        Groupclass.count -= 1

或用于

type()
获取本地参考:

def __del__(self):    type(self).count -= 1

但是请注意,这意味着

count
更改的语义
Groupclass
是子类的(每个子类都有一个
.count
属性,而不是只有
Groupclass
一个
.count
属性)。

__del__
挂钩文档中引用:

警告
:由于在不稳定的情况下

__del__()
调用方法,在执行过程中发生的异常将被忽略,并显示警告
sys.stderr
。同样,当
__del__()
响应于模块被删除而被调用时(例如,当执行程序时),该
__del__()
方法引用的其他全局变量可能已经被删除或正在被拆除(例如,进口机械关闭)
)。为此原因,
__del__()
方法应做到维持外部不变性所需的绝对最小值。从版本1.5开始,Python保证在删除其他全局变量之前,先从其模块中删除名称以单个下划线开头的全局变量。如果不存在对此类全局变量的其他引用,则这可能有助于确保在
__del__()
调用该方法时导入的模块仍然可用。

如果您使用的是Python 3,则还有两个附加说明:

  • CPython 3.3自动将随机哈希盐应用到字典中

    str
    使用的键
    globals
    ;这也影响清理全局变量的顺序, 可能 是您仅在 某些 运行中看到了问题。

  • None
    根据安全对象完成,CPython 3.4不再将全局变量设置为(在大多数情况下);参见PEP 442。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5639649.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存