Python 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__(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
Может ли кто-нибудь сказать мне, что я сделал не так?1 ответ:
Ваш метод
__del__предполагает, что класс все еще присутствует к моменту его вызова.Это предположение неверно.
Groupclassуже был очищен при выходе из программы Python и теперь имеет значениеNone.Сначала проверьте, существует ли глобальная ссылка на класс:
def __del__(self): if Groupclass: Groupclass.count -= 1Или используйте
type(), чтобы получить локальную ссылку:def __del__(self): type(self).count -= 1Но обратите внимание, что это означает, что семантика для
countизменяется, еслиGroupclassподкласс (каждый подкласс получает.countатрибут против толькоGroupclass, имеющего атрибут.count).Цитирую из документации по крюку
__del__:Предупреждение : из-за опасных обстоятельств, при которых вызываются методы
__del__(), исключения, возникающие во время их выполнения, игнорируются, и вместо них выводится предупреждениеsys.stderr. Кроме того, когда__del__()вызывается в ответ на удаление модуля (например, при выполнении программы), другие глобалы, на которые ссылается метод__del__(), могут быть вызваны в ответ на удаление модуля. уже были удалены или в процессе сноса (например, остановка импортного оборудования). По этой причине методы__del__()должны выполнять абсолютный минимум, необходимый для поддержания внешних инвариантов. Начиная с версии 1.5, Python гарантирует, что глобалы, имя которых начинается с одного подчеркивания, удаляются из своего модуля до удаления других глобалов; если других ссылок на такие глобалы не существует, это может помочь гарантировать, что импортированные модули по-прежнему доступны в модуле. время, когда вызывается метод__del__().Если вы используете Python 3, применяются два дополнительных Примечания:
CPython 3.3 автоматически применяетрандомизированную хэш-соль к ключам
str, используемым в словареglobals; это также влияет на порядок очистки глобалов, и этоможет быть , что вы видите проблему только нанекоторых запусках.CPython 3.4 больше не устанавливает глобалы в
None(в большинстве случаев), как perSafe Object Finalization ; см.PEP 442 .