Общий совет: не используйте __ del __ в Python. Это может сломать сборку мусора несколькими способами, особенно в случае циклических ссылок между объектами.
В вашем примере существуют различные проблемы, связанные с использованием execfile (), что не является наилучшей практикой, и переопределением глобальных переменных. Кстати, если вам действительно нужно создать псевдодеструктор (т. Е. Код, который вызывается всякий раз, когда объект получает мусор), напишите так называемую функцию «финализатор» (это не совсем деструктор) и вызовите ее с помощью weakref обратный вызов. Конечно, это НЕ должен быть метод экземпляра, и помните, что лямбда на самом деле создает замыкание, поэтому убедитесь, что в обратном вызове не пропущена любая ссылка на себя! Если вам нужны данные из уничтоженного экземпляра, используйте подход аргумента func по умолчанию, просто убедитесь, что никогда не ссылается на «self» внутри лямбды, иначе это не будет работать.
from weakref import ref
from time import sleep
class Person4:
'''Represents a person'''
population = 0
def __init__(self, name):
'''Initialize the person's data'''
self.name = name
print 'Initializing %s'% self.name
#When the person is created they increase the population
Person4.population += 1
self._wr = ref(self, lambda wr, name=self.name: Person4_finalizer(name))
def Person4_finalizer(name):
'''I am dying'''
print '%s says bye' % name
Person4.population -= 1
if Person4.population == 0:
print 'I am the last one'
else:
print 'There are still %d left' % Person4.population
p1 = Person4("one")
p2 = Person4("two")
p3 = Person4("three")
del p2
del p3
sleep(5)
вывод (сон помогает увидеть, что происходит):
Initializing one
Initializing two
Initializing three
two says bye
There are still 2 left
three says bye
There are still 1 left
one says bye
I am the last one