-->

Python的AttributeError的上__del__Python的AttributeErro

2019-05-12 02:59发布

我有一个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

谁能告诉我什么我,我做错了什么?

Answer 1:

你的__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词典; 这也影响其全局被清理的顺序,这可能是因为你看到只有一些运行的问题。

  • CPython的3.4不再设置全局到None (在大多数情况下),按照安全对象终止 ; 见PEP 442 。



文章来源: Python attributeError on __del__