self[, ...]) |
self) |
x.__del__()
-- il primo
decrementa il contatore di riferimenti per x
di uno, mentre
l'altro viene chiamato solo quando il contatore di riferimenti per
x
raggiunge zero. Alcune situazioni comuni che possono
prevenire il raggiungimento di zero da parte del contatore di
riferimenti di un oggetto include: riferimenti circolari tra oggetti
(per esempio, una lista doppiamente linkata o una struttura dati ad
albero con parenti e figli puntatori); un riferimento all'oggetto nel
frame dello stack di una funzione che può sollevare un'eccezione (il
traceback memorizzato in sys.exc_traceback
mantiene il frame
dello stack attivo); o un riferimento all'oggetto che nel frame dello
stack raggiunge un eccezione non gestita in modo interattivo (il
traceback memorizzato in sys.last_traceback
mantiene il frame
dello stack attivo). La prima situazione può essere rimediata solo da
un'esplicita rottura dei cicli; le ultime due situazioni possono
essere risolte memorizzando None
in sys.exc_traceback
o
sys.last_traceback
. Riferimenti circolari inutili vengono
scoperti quando viene abilitata l'opzione cycle detector (è attiva in
modo predefinito), ma possono essere ripuliti solo se non ci sono
metodi __del__() coinvolti a livello Python. Far riferimento
alla documentazione del modulo
gc per maggiori
informazioni su come i metodi __del__() vengono gestiti dai
cycle detector, in particolare la descrizione del valore della
garbage
.
sys.stderr
. Inoltre, quando __del__() viene
invocato come risposta ad un modulo che deve essere rimosso (per
esempio, quando l'esecuzione di un programma raggiunge il termine),
altri riferimenti globali referenziati dal metodo __del__()
possono dover essere cancellati. Per questa ragione, i metodi
__del__() dovrebbero fare il minimo indispensabile in assoluto
per mantenere l'esterno invariato. Dalla versione 1.5, Python
garantisce che questi riferimenti globali i cui nomi iniziano con un
singolo carattere di sottolineatura siano rimossi dai propri moduli
prima che altri riferimenti globali vengano rimossi; il fatto che non
esistano altri riferimenti globali assicura che i moduli importati
siano ancora disponibili al momento della chiamata al metodo
__del__().
self) |
Questo è il tipico uso per il debugging, pertanto è importante che la rappresentazione sia ricca di informazioni e non ambigua.
self) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
x<y
chiama x.__lt__(y)
,
x<=y
chiama x.__le__(y)
,
x==y
chiama x.__eq__(y)
,
x!=y
e x<>y
chiama
x.__ne__(y)
,
x>y
chiama x.__gt__(y)
e
x>=y
chiama x.__ge__(y)
.
Questi metodi possono restituire qualsiasi valore, ma se l'operatore
di confronto viene usato in un contesto booleano, il valore restituito
dovrebbe essere interpretabile come un valore booleano, altrimenti
viene sollevata un'eccezione TypeError. Per convenzione,
False
viene usato per falso e True
per vero.
Non ci sono relazioni implicite tra gli operatori di confronto. Il
fatto che x==y
sia vero non implica che
x!=y
sia falso. Per questo, definendo
__eq__, si dovrebbe anche definire __ne__ in modo
che gli operatori si comportino come ci si aspetta.
Non ci sono versioni riflesse (con argomenti scambiati) di questi metodi (quando cioè l'argomento di sinistra non supporta l'operazione mentre lo supporta l'argomento di destra); piuttosto, __lt__() e __gt__() sono l'una il contrario dell'altra, la stessa cosa per __le__() e __ge__() ed anche __eq__() e __ne__() riflettono la medesima situazione.
Gli argomenti dei metodi di confronto ricco non vengono mai forzati.
Un metodo di confronto può restituire NotImplemented
se
l'operazione tra la coppia di argomenti non viene implementata.
self, other) |
self < other
, zero se self == other
, un intero
positivo se self > other
. Se non viene definita alcuna
operazione __cmp__(), __eq__() o __ne__(),
istanze di classe vengono confrontate tramite oggetti identità
(``indirizzi''). Si veda anche la descrizione di __hash__()
per alcune note sulla creazione di oggetti che supportino operazioni
di confronto personalizzate e che siano utilizzabili come chiavi di
dizionari.
(Nota: la restrizione che le eccezioni non vengano propagate da
__cmp__() è stata rimossa a partire dalla versione 1.5 di
Python.)
self, other) |
self) |
self) |
bool()
; dovrebbe restituire False
o
True
, o il loro equivalente numerico (0
o 1
).
Quando questo metodo non viene definito, viene richiamato
__len__() se definito (si veda di seguito). Se in una classe
non vengono definiti né __len__() né __nonzero__(),
tutte le loro istanze vengono considerate vere.
self) |
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.