del上的Python属性错误__
我有一个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_
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
键应用a;这也会影响全局清理的顺序,可能是因为您只在某些运行中看到问题str
- 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
开头的名称,以便稍后删除,因此您仍然可以依赖导入的模块(通常具有非私有名称)仍然可用。