Python属性错误__

2024-09-28 21:46:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 对象selftimeinitmaindefcountclass
1条回答
网友
1楼 · 发布于 2024-09-28 21:46:34

您的__del__方法假设类在被调用时仍然存在。

这种假设是错误的。Groupclass在Python程序退出时已被清除,现在设置为None

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

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

或者使用type()获取本地引用:

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

但请注意,这意味着如果Groupclass是子类,那么count的语义就会改变(每个子类都有一个.count属性,而只有Groupclass有一个.count属性)。

引用__del__钩子文档:

Warning: Due to the precarious circumstances under which __del__() methods are invoked, exceptions that occur during their execution are ignored, and a warning is printed to sys.stderr instead. Also, when __del__() is invoked in response to a module being deleted (e.g., when execution of the program is done), other globals referenced by the __del__() method may already have been deleted or in the process of being torn down (e.g. the import machinery shutting down). For this reason, __del__() methods should do the absolute minimum needed to maintain external invariants. Starting with version 1.5, Python guarantees that globals whose name begins with a single underscore are deleted from their module before other globals are deleted; if no other references to such globals exist, this may help in assuring that imported modules are still available at the time when the __del__() method is called.

如果您使用的是Python3,则需要另外两个注意事项:

  • CPython 3.3会自动将randomized hash salt应用到str字典中使用的globals键;这也会影响全局数据的清理顺序,而且可能会只在运行的部分上看到问题。

  • CPython 3.4不再根据Safe Object Finalization将全局变量设置为None(在大多数情况下);请参见PEP 442

相关问题 更多 >