Piszę prostą grę platformową, a ja odkryłem, że usuwając instancje "duchów", trwają i nie są zbierane śmieci. Wygląda na to, że chociaż usuwam wszystkie odniesienia, obiekty duchów mają pewne wewnętrzne odwołania, które uniemożliwiają ich zbieranie śmieci. W szczególności mają atrybuty, które są przełącznikami metod.wewnętrzny odnośnik zapobiega zbieraniu śmieci
Poniższy kod ilustruje mój problem:
import weakref
weak_ghosts = weakref.WeakKeyDictionary()
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()
weak_ghosts[ghost] = None
#ghost.switch = {} # uncomment this line and ghost is successfully removed
del ghost
print "number of ghosts =", len(weak_ghosts)
#output:
number of ghosts = 1
pytania:
- co faktycznie jest grane?
- Co powinienem zrobić, aby uniknąć tej sytuacji?
- Czy używam właściwej metodologii do tworzenia przełączalnego słownika metod?
Ale pamiętaj, aby przekazać obiekt jawnie, gdy faktycznie je wywołujesz –