2012-11-25 7 views
7

Czy interpreter języka Python zręcznie obsługuje przypadki, w których instancja obiektu usuwa ostatnie odwołanie do siebie?Obiekt usuwa odwołanie do siebie

Rozważmy następujący (wprawdzie bezużyteczny) Moduł:

all_instances = [] 

class A(object): 
    def __init__(self): 
     global all_instances 
     all_instances.append(self) 

    def delete_me(self): 
     global all_instances 
     self.context = "I'm still here" 
     all_instances.remove(self) 
     print self.context 

a teraz Zastosowanie:

import the_module 
a = the_module.A() 
the_deletion_func = a.delete_me 
del a 
the_deletion_func() 

To nadal drukować I'm still here, ale czy istnieje sytuacja wyścigu z Garbage Collector Pythona, który jest o zbieraniu instancji obiektu?
Czy odwołanie do funkcji obiektu powoduje zapisanie dnia?
Czy interpreter zachowuje odwołania do obiektu, którego kod obecnie wykonuje, dopóki nie zostanie zakończony?

Odpowiedz

6

Nie, nie ma żadnych takich warunków wyścigu. Usuwasz odniesienie, więc liczba ref spadnie do 1, a obiekt zostanie wyczyszczony po usunięciu odwołania do metody.

Odniesienie the_deletion_func wskazuje na metodę, która wskazuje na instancję (jak również na klasę), więc nadal istnieje tam odniesienie.

Obecnie stosowane metody mają zmienną lokalną self, która jest również odniesieniem do instancji, ale najczęściej jest to opakowanie metody, które zapewnia to odwołanie.