2.4. Tutto è un oggetto

Nel caso non ve ne foste accorti, ho appena detto che le funzioni in Python hanno attributi e che questi attributi sono disponibili a runtime.

Una funzione, come ogni altra cosa in Python, è un oggetto.

Esempio 2.5. Accedere alla docstring della funzione buildConnectionString

>>> import odbchelper                              1
>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
>>> print odbchelper.buildConnectionString(params) 2
server=mpilgrim;uid=sa;database=master;pwd=secret
>>> print odbchelper.buildConnectionString.__doc__ 3
Build a connection string from a dictionary

Returns string.
1 La prima linea importa il programma odbchelper come modulo. Una volta che avete importato un modulo potete fare riferimento ad ogni sua funzione, classe o attributo pubblico. I moduli possono quindi avere accesso a funzionalità presenti in altri moduli e lo stesso principio rimane valido anche per quanto riguarda l'IDE. Questo è un concetto molto importante e ne riparleremo più approfonditamente dopo.
2 Quando volete usare funzioni definite in moduli importati, dovete includere il nome del modulo. Così non è possibile dire solo buildConnectionString, deve essere odbchelper.buildConnectionString. Se avete usato le classi in Java, questo dovrebbe esservi vagamente familiare.
3 Invece di chiamare la funzione come vi sareste aspettati, abbiamo chiesto uno dei suoi attributi, __doc__.
Nota
import in Python è come require in Perl. Una volta che avete importato un modulo Python, accedete alle sue funzioni con module.function; una volta che avete richiesto un modulo Perl, accedete alle sue funzioni con modulo::funzione.

Prima di continuare, voglio brevemente fare riferimento al percorso di ricerca delle librerie. Python cerca in diversi luoghi quando tentate di importare un modulo. In particolare, cerca in tutte le directory definite in sys.path. Questa è semplicemente una lista e potete facilmente vederla o modificarla con i normali metodi delle liste (impareremo di più sulle liste più avanti in questo capitolo).

Esempio 2.6. Percorso di ricerca per l'importazione

>>> import sys                 1
>>> sys.path                   2
['', '/usr/local/lib/python2.2', '/usr/local/lib/python2.2/plat-linux2', 
'/usr/local/lib/python2.2/lib-dynload', '/usr/local/lib/python2.2/site-packages', 
'/usr/local/lib/python2.2/site-packages/PIL', '/usr/local/lib/python2.2/site-packages/piddle']
>>> sys                        3
<module 'sys' (built-in)>
>>> sys.path.append('/my/new/path') 4
1 L'importazione del modulo sys restituisce tutte le sue funzioni e attributi disponibili.
2 sys.path è una lista di nomi di directory che costituiscono l'attuale percorso di ricerca (il vostro sarà diverso, in base al sistema operativo, la versione di Python in esecuzione e dove è stato installato). Python cercherà in queste directory (e in questo ordine) un file .py corrispondente al nome del modulo che state tentando di importare.
3 A dire la verità, ho mentito; la verità è più complicata di questa, poiché non tutti i moduli sono situati nei file .py. Alcuni, come il modulo sys, sono "moduli built-in"; sono veramente integrati nell'interprete dello stesso Python. I moduli built-in si comportano proprio come moduli normali, ma il loro sorgente Python non è disponibile, visto che non sono scritti in Python ! (Il modulo sys è scritto in C)
4 Potete aggiungere una nuova directory al percorso di ricerca di Python a runtime aggiungendo il nome della directory a sys.path. Dopo Python cercherà anche in quella directory, quando tenterete di importare un modulo. L'effetto dura fino a quando Python rimane in esecuzione (parleremo di più riguardo append ed altri metodi delle liste, più avanti in questo capitolo).

Tutto in Python è un oggetto e quasi tutto ha attributi e metodi. [1] Tutte le funzioni hanno l'attributo built-in __doc__, che ritorna la docstring definita nel codice sorgente della funzione. Il modulo sys è un oggetto che ha (fra le altre cose) un attributo chiamato path ... e così via.

Questo fatto è così importante che sto per ripetertelo, nel caso non lo avessi ancora colto: tutto in Python è un oggetto. Le stringhe sono oggetti. Le liste sono oggetti. Le funzioni sono oggetti. Persino i moduli sono oggetti.

Ulteriori letture

Footnotes

[1] Diversi linguaggi di programmazione definiscono gli “oggetti” in modi diversi. In alcuni, significa che tutti gli oggetti devono avere attributi e metodi; in altri, significa che da tutti gli oggetti sono derivabili altre classi. In Python, la definizione è meno ristretta; alcuni oggetti non hanno né attributi né metodi (ne parleremo più avanti in questo capitolo), e non non sono derivabili classi da tutti gli oggetti (altre informazioni su quest'argomento nel capitolo 3). Ma ogni cosa è un oggetto, nel senso che può essere assegnato ad una variabile o passato come argomento ad una funzione (più dettagli nel capitolo 2).