3.1 Oggetti, valori e tipi

Gli oggetti sono delle astrazioni di Python per i dati. Tutti i dati in Python vengono rappresentati da oggetti o da relazioni tra oggetti. (In un certo senso, e conformemente al modello di Von Neumann di ``stored program computer'', anche il codice viene rappresentato come un oggetto).

Ogni oggetto ha un'identit�, un tipo ed un valore. L'identit� di un oggetto non cambia mai dopo che � stato creato; potete pensare a questa come l'indirizzo di memoria dell'oggetto. L'operatore `is' confronta l'identit� di 2 oggetti; la funzione id() restituisce un intero che rappresenta l'identit� dell'oggetto (attualmente implementato come il suo indirizzo). Il tipo di un oggetto � anch'esso immutabile.3.1 Il tipo di un oggetto determina le operazioni che l'oggetto supporta (per esempio, ``� possibile determinarne la lunghezza?'') e definisce anche i possibili valori per gli oggetti di quel tipo. La funzione type() restituisce il tipo dell'oggetto (che � a sua volta un oggetto). Il valore di alcuni oggetti pu� cambiare. Gli oggetti il cui valore pu� cambiare vengono detti mutabili; gli oggetti il cui valore non pu� cambiare vengono detti immutabili. (Il valore di un oggetto contenitore immutabile che contiene un riferimento ad un oggetto mutabile pu� cambiare quando cambia il valore di quest'ultimo; comunque il contenitore viene ancora considerato immutabile, poich� la collezione di oggetti che contiene non pu� essere cambiata. Perci� immutabile non � strettamente equivalente ad un valore non modificabile, la differenza � pi� sottile). La mutabilit� di un oggetto viene determinata dal suo tipo; per esempio numeri, stringhe e tuple sono immutabili, mentre dizionari e liste sono mutabili.

Gli oggetti non vengono mai esplicitamente distrutti; comunque, quando diventano irrangiungibili, possono essere distrutti tramite il Garbage collector. All'implementazione viene concesso di posticipare il garbage collector oppure ometterlo totalmente, il modo in cui opera il Garbage Collector � una questione di qualit� dell'implementazione, finch� non viene raccolto un oggetto che � ancora raggiungibile. Nota implementativa: l'implementazione corrente utilizza uno schema di conteggio dei riferimenti che (facoltativamente) ritarda l'intercettazione di oggetti non pi� referenziati, ma non garantisce di intercettare le dipendenze cicliche. Vedere la Libreria Python di riferimento per informazioni sul controllo del garbage collector per dipendenze cicliche.

Notare che l'utilizzo dell'implementazione delle facility di tracing e debugging pu� mantenere vivi oggetti che normalmente sarebbero riciclabili. Notare anche che l'intercettazione di un'eccezione con l'istruzione `try...except' pu� tenere in vita un oggetto.

Alcuni oggetti contengono riferimenti a risorse ``esterne'' come file aperti o finestre. Bisogna comprendere che queste risorse vengono liberate quando l'oggetto viene riciclato tramite il GC, ma poich� nulla garantisce che il GC intervenga, questi oggetti forniscono anche un metodo esplicito per rilasciare le risorse esterne, generalmente un metodo close(). Ai programmi � caldamente raccomandato chiudere questi oggetti. L'istruzione `try...finally' fornisce un modo conveniente per farlo.

Alcuni oggetti contengono riferimenti ad altri oggetti; questi vengono chiamati contenitori. Sono esempi di contenitori tuple, liste e dizionari. Questi riferimenti sono parte del valore del contenitore. In molti casi, quando parliamo del valore del contenitore, implichiamo il valore, non l'identit� degli oggetti contenuti; comunque, quando parliamo di mutabilit� di un contenitore, viene implicata solo l'identit� dell'oggetto immediatamente contenuto. Perci�, se un contenitore immutabile (come una tupla) contiene un riferimento ad un oggetto mutabile, il suo valore pu� cambiare se cambia questo oggetto mutabile.

I tipi coinvolgono quasi tutti gli aspetti del comportamento di un oggetto. Anche l'importanza dell'identit� degli oggetti ne viene coinvolta in qualche modo: per i tipi immutabili, le operazioni che computano nuovi valori possono in realt� restituire un riferimento ad un oggetto esistente con lo stesso valore, mentre per gli oggetti mutabili non � ammesso. Per esempio, dopo "a = 1; b = 1", a e b possono fare riferimento allo stesso oggetto con il valore uno, a seconda dell'implementazione, ma dopo "c = []; d = []" � garantito che c e d faranno riferimento a due liste differenti, uniche e vuote (notare invece che "c = d = []" assegna lo stesso oggetto a c e d).



Footnotes

... immutabile.3.1
Da Python 2.2, � iniziato un graduale lavoro di unificazione di tipi e classi, che rendono alcune delle affermazioni in questo manuale non accurate al 100% ed incomplete: per esempio, adesso � possibile, in alcuni casi, cambiare il tipo di un oggetto, sotto alcune condizioni controllate. Finch� questo manuale non subir� un'intensa revisione, deve essere considerato come autoritativo solo circa le ``classi classiche'', che sono ancora il comportamento predefinito, per ragioni di compatibilit�, in Python 2.2 e 2.3.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.