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字典中使用的键; 这也会影响清理全局变量的顺序,也可能只是在某些运行中看到了问题.