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