我有一个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__方法假定类在调用时仍然存在。
这个假设是错误的。当您的python程序退出时,Groupclass已经被清除,现在设置为None
首先测试对类的全局引用是否仍然存在:

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

或使用type()获取本地引用:
def __del__(self):
    type(self).count -= 1

但是请注意,这意味着,如果count是子类,则Groupclass的语义会发生变化(每个子类都有一个.count属性,而只有Groupclass有一个.count属性)。
引用__del__hook文档:
警告:由于调用__del__()方法的不稳定情况,在执行过程中发生的异常将被忽略,并将警告打印到sys.stderr中。此外,当为响应删除的模块而调用__del__()时(例如,当程序执行完成时),__del__()方法引用的其他全局可能已被删除或正在被删除(例如,导入机器关闭)。因此,__del__()方法应该做保持外部不变量所需的绝对最小值。从1.5版开始,python保证在删除其他全局变量之前从其模块中删除以单个下划线开头的全局变量;如果不存在对此类全局变量的其他引用,这有助于确保在调用方法。
如果您使用的是python 3,则需要另外两个注意事项:
cpython 3.3自动将randomized hash salt应用于__del__()字典中使用的str键;这也会影响全局清除的顺序,可能是您只在某些运行中看到问题。
cpython 3.4不再根据Safe Object Finalization将全局设置为globals(在大多数情况下);请参见PEP 442

09-11 20:08