Normalnym odwołaniem do AKA jest to, że utrzymuje przy życiu określony obiekt: w CPython każdy obiekt zachowuje liczbę (normalnych) odniesień do niego, która istnieje (zwana "liczbą odniesienia" lub RC) i idzie z dala, gdy tylko RC osiągnie zero (sporadyczne znaki międzypokoleniowe i zamiatanie mijają również "pętle odniesienia").
Gdy nie chcesz, aby obiekt pozostał przy życiu, tylko dlatego, że inny go odnosi, użyjesz "słabego odniesienia", specjalnej odmiany odniesienia, która nie zwiększa RC; patrz: the docs w celu uzyskania szczegółowych informacji. Oczywiście, ponieważ odesłany obiekt CAN odejdzie, jeśli nie zostanie w inny sposób określony (cały cel słabego ref, a nie normalny! -), obiekt odsyłający musi zostać ostrzeżony, jeśli spróbuje użyć obiektu to zniknęło - i ten alert jest podawany dokładnie przez wyjątek, który widzisz.
W kodzie ...:
def __init__(self,dbname):
tmp = sqlite.connect(dbname)
self.con = tmp.cursor()
def __del__(self):
self.con.close()
tmp
jest normalne odniesienie do związku ... ale jest to zmienna lokalna, więc odchodzi pod koniec __init__
. (Szczególnie nazwany ;-) kursor self.con
pozostaje, ALE jest wewnętrznie zaimplementowany tylko do przechowywania WEAK do połączenia, więc połączenie znika gdy tmp
robi. Tak więc w __del__
nie zadziała połączenie z .close
(ponieważ kursor musi używać połączenia w celu zamknięcia się).
rozwiązanie Najprostszy jest następujący malutka zmiana:
def __init__(self,dbname):
self.con = sqlite.connect(dbname)
self.cur = self.con.cursor()
def __del__(self):
self.cur.close()
self.con.close()
Ja również brane możliwość korzystania con do łączenia i cur za kursorem, ale Python nie będzie miał nic przeciwko, jeśli jesteś zapalonym aby zamienić te (po prostu pozostawisz czytelników zakłopotanych ;-).
Problem polega na tym, że nie wiem, co oznaczają "słabe" lub "silne" odniesienia. Nie wiem nawet, co oznacza odniesienie. – Verrtex