Существует круговая ссылка, созданная self.switch
ссылкой на объект, частью которого она является.Проверьте это:
import weakref
class Ghost(object):
def __init__(self):
#pass
self.switch = {'eat':self.eat, 'sleep':self.sleep}
def eat(self):
pass
def sleep(self):
pass
ghost = Ghost()
def callback(o):
print 'callback', o
wref = weakref.ref(ghost, callback)
print 'del ghost'
del ghost
print 'after del ghost'
Отпечатки:
del ghost
after del ghost
callback <weakref at 00B55FC0; dead>
Таким образом, фактический объект был просто очищен при выключении.
Вы можете запустить ГХ вручную, чтобы увидеть эффект,Добавьте это в конец приведенного выше сценария:
print 'gc.collect'
import gc
gc.collect()
print 'after gc.collect'
Теперь вы увидите:
del ghost
after del ghost
gc.collect
callback <weakref at 00B55FC0; dead>
after gc.collect
Обратите внимание, что по умолчанию этот GC включен и будет работать время от времени,Это очистит ваши ghost
объекты, потому что они становятся недоступными циклическими ссылками.