Специальный метод __del_ в Python3, не понимаю, когда она вызывается? Вопрос такой у меня есть специальный метод __del__ внутри класса. В книге A Byte of Python сказано,ссылка в книгу страница 114-115. __del__ запускается только тогда, когда объект перестаёт использоваться, заранее не известно когда это момент наступеть. Вернемся на мою код, у меня после создания экземпляра сразу вызывается __del__ тоест вот я создаю droid1 = Robot('R2-D2') droid1.sayHi() После того сразу вызывается __del__ А если после droid1 создаем еще объект droid2 то тогда после droid1 сразу не вызывается __del__droid1 = Robot('R2-D2') droid1.sayHi() droid2 = Robot('R2-D2') droid2.sayHi() а после droid2 вызывается __del__. В книге написано, явно уничтожается объектdel droid1 del droid2 У меня все вызывается без уничтожения с помощю __del__ что не так или в порядке. Я не понимаю. Вот такой код.class Robot: population = 0 def __init__(self,name): self.name = name print('(Инициализация {0})'.format(self.name)) Robot.population += 1 def __del__(self): print('{0} Уничтожается!'.format(self.name)) Robot.population -= 1 if Robot.population == 0: print('{0} Был последним.'.format(self.name)) else: print('Осталось {0:d} работающих роботов'.format(Robot.population)) def sayHi(self): print('Приветствую! Мои хозяева называют меня {0}.'.format(self.name)) def howMany(): print('У нас {0:d} роботов.'.format(Robot.population)) howMany = staticmethod(howMany) droid1 = Robot('R2-D2') droid1.sayHi() droid1.howMany() print() droid2 = Robot('cp-120') droid2.sayHi() droid2.howMany()
Метод del в Python вызывается автоматически при уничтожении объекта сборщиком мусора. Однако момент времени, когда именно будет вызван метод del, не гарантирован. Это может произойти сразу после того, как объект перестал использоваться, либо в любой другой момент, когда интерпретатор Python решит освободить память, занимаемую объектом.
В вашем коде, если после создания объекта droid1 вы создаете новый объект droid2, то метод del для droid1 может быть вызван после создания droid2, потому что дорид1 перестает использоваться только тогда, когда вы переопределяете его. Таким образом, можно сказать, что вызов метода del зависит от работы сборщика мусора Python.
Если вам не нужно опираться на точный момент вызова метода del, а просто нужно освобождать ресурсы или выполнять какие-то другие действия при уничтожении объекта, вы можете использовать метод del как это сделано в вашем коде. В вашем случае он работает правильно, и объекты удаляются корректно.
Метод del в Python вызывается автоматически при уничтожении объекта сборщиком мусора. Однако момент времени, когда именно будет вызван метод del, не гарантирован. Это может произойти сразу после того, как объект перестал использоваться, либо в любой другой момент, когда интерпретатор Python решит освободить память, занимаемую объектом.
В вашем коде, если после создания объекта droid1 вы создаете новый объект droid2, то метод del для droid1 может быть вызван после создания droid2, потому что дорид1 перестает использоваться только тогда, когда вы переопределяете его. Таким образом, можно сказать, что вызов метода del зависит от работы сборщика мусора Python.
Если вам не нужно опираться на точный момент вызова метода del, а просто нужно освобождать ресурсы или выполнять какие-то другие действия при уничтожении объекта, вы можете использовать метод del как это сделано в вашем коде. В вашем случае он работает правильно, и объекты удаляются корректно.