当前位置: 首页 > 面试题库 >

__del__上的Python attributeError

叶阳
2023-03-14
问题内容

我有一个python类对象,我想分配一个类变量的值

class Groupclass(Workerclass):
    """worker class"""
    count = 0

    def __init__(self):
        """initialize time"""
        Groupclass.count += 1
        self.membercount = 0;
        self.members = []

    def __del__(self):
        """delte a worker data"""
        Groupclass.count -= 1


if __name__ == "__main__":
    group1 = Groupclass()

该执行结果是正确的,但是有一条错误消息指出:

Exception AttributeError: "'NoneType' object has no attribute 'count'" in <bound method Groupclass.__del__ of <__main__.Groupclass instance at 0x00BA6710>> ignored

有人可以告诉我我做错了什么吗?


问题答案:

您的__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。



 类似资料:
  • 我们知道, Python 通过调用 __init__() 方法构造当前类的实例化对象,而本节要学的 __del__() 方法,功能正好和 __init__() 相反,其用来销毁实例化对象。 事实上在编写程序时,如果之前创建的类实例化对象后续不再使用,最好在适当位置手动将其销毁,释放其占用的内存空间(整个过程称为 垃圾回收(简称GC) )。 大多数情况下,Python 开发者不需要手动进行垃圾回收,

  • 问题内容: 我有一些test.py文件: 当我运行10次()时,它总是产生下一个输出: 但是,如果我在脚本末尾添加调用: 在10个案例中有5个(随机) 在后半部分情况下: 我在Windows 7 x64上使用Python3.4.3 [MSC v.1600 32位]。那么为什么方法不是每次都调用?我是否需要使用其他退出方法来传递脚本的返回代码,并确保所有析构函数都已执行?还有一个相关的问题:是否可以

  • 问题内容: 有人可以解释为什么以下代码会如此行为: 输出(请注意,永远不会调用d2的析构函数)是(python 2.7) 有没有一种方法可以“修复”代码,以便在不删除添加的方法的情况下调用析构函数?我的意思是,放置d2.func = None的最佳位置将在析构函数中! 谢谢 [edit]基于前几个答案,我想澄清一下,我并不是在问using的优点(或不足之处)。我试图创建最短的函数来证明我认为是非直

  • 问题内容: 我正在阅读代码。有一个定义方法的类。我发现此方法用于销毁该类的实例。但是,我找不到使用此方法的地方。这样做的主要原因是我不知道如何使用此方法,可能不是这样的:。那么,我的问题是如何调用该方法? 问题答案: 是终结器。当对象被垃圾回收时调用该方法,该操作在删除该对象的所有引用之后的某个时间发生。 在一个简单的情况下,这可能是在你说完之后,或者如果x是局部变量,则在函数结束之后。特别是,除

  • 本文向大家介绍Python类方法__init__和__del__构造、析构过程分析,包括了Python类方法__init__和__del__构造、析构过程分析的使用技巧和注意事项,需要的朋友参考一下 最近学习《Python参考手册》学到Class部分,遇到了类的构造析构部分的问题: 1、什么时候构造? 2、什么时候析构? 3、成员变量如何处理? 4、Python中的共享成员函数如何访问? ----

  • Animal.java 我为它创建了以下自定义断言: AnimalAssert.java 编辑:基于第一个答案(cglib需要一个),我用一个no arg构造函数更新了动物类,但是抛出了相同的异常