You are here: Partenza > Dive Into Python > Una struttura orientata agli oggetti > Ancora sui moduli | << >> | ||||
Dive Into PythonPython per programmatori esperti |
I moduli, come qualunque altra cosa in Python, sono oggetti. Una volta importato, si può sempre ottenere un riferimento ad un modulo attraverso il dizionario globale sys.modules.
>>> import sys >>> print '\n'.join(sys.modules.keys()) win32api os.path os exceptions __main__ ntpath nt sys __builtin__ site signal UserDict stat
>>> import fileinfo >>> print '\n'.join(sys.modules.keys()) win32api os.path os fileinfo exceptions __main__ ntpath nt sys __builtin__ site signal UserDict stat >>> fileinfo <module 'fileinfo' from 'fileinfo.pyc'> >>> sys.modules["fileinfo"] <module 'fileinfo' from 'fileinfo.pyc'>
>>> from fileinfo import MP3FileInfo >>> MP3FileInfo.__module__ 'fileinfo' >>> sys.modules[MP3FileInfo.__module__] <module 'fileinfo' from 'fileinfo.pyc'>
Ogni classe Python ha un attributo di classe predefinito di nome __module__, che contiene il modulo in cui la classe è definita. | |
Combinando questo, con il diziorario sys.modules, si può ottenere un riferimento al modulo in cui una classe è definita. |
def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]): "get file info class from filename extension" subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:] return hasattr(module, subclass) and getattr(module, subclass) or FileInfo
Questa è una funzione con due argomenti: il nome del file è richiesto, ma il parametro module è opzionale ed ha come predefinito il modulo che contiene la classe FileInfo. Questo sembra inefficiente, perché si potrebbe credere che Python calcoli l'espressione con sys.modules ogni volta che la funzione è invocata. In realtà, Python calcola l'espressione usata come valore predefinito solo una volta, la prima volta che il modulo viene importato. Come si vedrà più avanti, questa funzione non viene mai chiamata con l'argomento module, cosicché module è usato come una costante definita a livello di funzione. | |
Scaveremo su questa traccia più avanti, dopo che ci saremo immersi nell'analisi del modulo os. Per ora fidatevi, la variabile subclass finisce per avere come valore il nome di una classe, come MP3FileInfo. | |
Si sa già tutto su getattr, che permette di ottenere il riferimento ad un oggetto dal suo nome. hasattr è una funzione complementare che controlla se un oggetto ha un particolare attributo; in questo caso, se un modulo ha una classe particolare (sebbene funzioni per ogni oggetto ed ogni attributo, proprio come getattr). In Italiano, questa linea di codice recita: “se questo modulo contiene una classe con lo stesso nome di subclass allora restituisci tale classe, altrimenti restituisci la classe base FileInfo”. |
<< Cicli for |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | |
Il modulo os >> |