del上的Python属性错误__

del上的Python属性错误__,python,class,attributeerror,del,Python,Class,Attributeerror,Del,我有一个python类对象,我想分配一个类变量的值 class Groupclass(Workerclass): """worker class""" count = 0 def __init__(self): """initialize time""" Groupclass.count += 1 self.membercount = 0; self.members = [] def __del_

我有一个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
Exception AttributeError:“'NoneType'对象在忽略中没有属性'count'”

有人能告诉我我做错了什么吗

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

这种假设是不正确的<当Python程序退出时,code>Groupclass
已被清除,现在设置为
None

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

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

def __del__(self):
    type(self).count -= 1
但请注意,这意味着如果
Groupclass
是子类的,则
count
的语义会发生变化(每个子类都有一个
.count
属性,而只有
Groupclass
有一个
.count
属性)

从钩子文档中引用:


警告:由于调用
\uu del\uuu()
方法的不稳定情况,在执行过程中发生的异常将被忽略,并将警告打印到
sys.stderr
。此外,当调用
\uuu del\uuu()
以响应被删除的模块时(例如,当程序执行完成时),
\uu del\uuu()
方法引用的其他全局变量可能已经被删除或正在被拆除过程中(例如,导入机器关闭)。出于这个原因,
\uu del\uu()
方法应该尽可能少地维护外部不变量。从版本1.5开始,Python保证在删除其他全局变量之前,从其模块中删除名称以单个下划线开头的全局变量;如果不存在对此类全局变量的其他引用,这可能有助于确保导入的模块在调用
\uu del\uu()
方法时仍然可用

如果您使用的是Python 3,则还需要注意两个问题:

  • CPython 3.3自动对
    globals
    字典中使用的
    str
    键应用a;这也会影响全局清理的顺序,可能是因为您只在某些运行中看到问题

  • CPython 3.4不再将globals设置为
    None
    (在大多数情况下),如下所示:;看

当调用
\uuuu del\uuuu()
方法时,垃圾收集机制可能会恢复Groupclass,因此使用Groupclass.xxx可能会失败。但是您可以通过
self.\uuu class\uuuu.count
访问count变量。代码如下:

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

您的
Workerclass
基类似乎有一个
\uuu del\uuuu
方法试图对
计数执行某些操作,但您没有在此处共享该方法。抱歉,我不知道这与此相关…您的消息只是一个警告,不是错误。
\uuuu del\uuuu
方法中的某些内容尝试使用
count
属性执行某些操作,但失败。
\uuuu del\uuuu
中实际上没有任何内容,除了
Groupclass.count-=1
。这也是困扰我的原因,因为我还没有做任何事情;这是相当相关的。谢谢。它现在正在工作。现在我的问题是,如果我想
del
一个
Groupclass
对象,
Groupclass
对象或“Groupclass”本身必须在执行
del
之前存在,那么这条语句似乎有点多余?@Chandler:不,当解释器存在时,可以在创建实例之前清除全局名称;
Groupclass
名称已被清除。您也可以使用
类型(self).count
来代替,除非您有没有自己的count的子类。仍然不太了解这个概念,但谢谢,我会研究这个!“从1.5版开始,Python保证在删除其他全局变量之前,从其模块中删除名称以单下划线开头的全局变量;如果不存在对此类全局变量的其他引用,这可能有助于确保在调用_del__()方法时,导入的模块仍然可用。”这是否意味着如果我重命名为_Groupclass,问题就解决了?@acai:no。这意味着绑定到名称开头为
\u
的对象可以依赖不以
\u
开头的名称,以便稍后删除,因此您仍然可以依赖导入的模块(通常具有非私有名称)仍然可用。