__del__上的Python attributeError

Shi*_*Lee 11 python class del attributeerror

我有一个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()
Run Code Online (Sandbox Code Playgroud)

此执行结果是正确的,但有一条错误消息说:

Exception AttributeError: "'NoneType' object has no attribute 'count'" in <bound method Groupclass.__del__ of <__main__.Groupclass instance at 0x00BA6710>> ignored
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 15

您的__del__方法假定该类在调用时仍然存在.

这个假设是不正确的.Groupclass已经清除了Python程序退出并且现在设置为None.

测试对类的全局引用是否仍然存在:

def __del__(self):
    if Groupclass:
        Groupclass.count -= 1
Run Code Online (Sandbox Code Playgroud)

或用于type()获取本地参考:

def __del__(self):
    type(self).count -= 1
Run Code Online (Sandbox Code Playgroud)

但请注意,这意味着count更改if 的语义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.