3.3.1 Oggetti con riferimenti deboli

Gli oggetti con riferimenti deboli non hanno attributi o metodi, ma permettono di ottenere il referente, se esiste ancora, chiamandolo:

>>> import weakref
>>> class Object:
...     pass
...
>>> o = Object()
>>> r = weakref.ref(o)
>>> o2 = r()
>>> o is o2
True

Se il referente non esiste più, una chiamata all'oggetto referente restituirà None:

>>> del o, o2
>>> print r()
None

Per verificare che un oggetto con riferimento debole esista ancora, si dovrà utilizzare l'espressione ref() is not None. Normalmente, il codice di un'applicazione che necessita di usare un riferimento ad un oggetto dovrebbe seguire questo modello:

# r è un oggetto con riferimento debole
o = r()
if o is None:
    # il referente è stato inserito nella garbage collection
    print "Oggetto allocato."
else:
    print "Oggetto ancora vivo!"
    o.do_something_useful()

L'utilizzo di un test separato per l'``esistenza in vita'' può dare luogo a delle interferenze in applicazioni che sfruttino i thread; un altro thread può provocare l'invalidamento di un riferimento debole prima che questo venga chiamato (dal thread attuale - NDT); l'esempio appena mostrato è sicuro sia in applicazioni multi thread che in applicazioni single thread.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.