| 導航:起始頁 > Dive Into Python > 異常和文件處理 > 使用 sys.modules | << >> | ||||
深入 Python :Dive Into Python 中文版Python 從新手到專家 [Dip_5.4b_CPyUG_Release] |
|||||
與其它任何 Python 的東西一樣,模塊也是對象。只要導入了,總可以用全局 dictionary sys.modules 來得到一個模塊的引用。
>>> import sys>>> print '\n'.join(sys.modules.keys())
win32api os.path os exceptions __main__ ntpath nt sys __builtin__ site signal UserDict stat
下面的例子展示了如何使用 sys.modules。
>>> 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'>
下面的例子將展示通過結合使用 __module__ 類屬性和 sys.modules dictionary 來獲取已知類所在的模塊。
>>> from fileinfo import MP3FileInfo >>> MP3FileInfo.__module__'fileinfo' >>> sys.modules[MP3FileInfo.__module__]
<module 'fileinfo' from 'fileinfo.pyc'>
| 每個 Python 類都擁有一個內置的類屬性 __module__,它定義了這個類的模塊的名字。 | |
| 將它與 sys.modules 字典復合使用,你可以得到定義了某個類的模塊的引用。 |
現在準備好了,看看在樣例程序 第 5 章 sys.modules 介紹的 fileinfo.py 中是如何使用的。這個例子顯示它的一部分代碼。
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 
| 這是一個有兩個參數的函數;filename 是必須的,但 module 是可選的并且 module 的缺省值包含了 FileInfo 類。這樣看上去效率低,因為你可能認為 Python 會在每次函數調用時計算這個 sys.modules 表達式。實際上,Python 僅會對缺省表達式計算一次,是在模塊導入的第一次。正如后面我們會看到的,我們永遠不會用一個 module 參數來調用這個函數,所以 module 的功能是作為一個函數級別的常量。 | |
| 我們會在后面再仔細研究這一行,在我們了解了 os 模塊之后。那么現在,只要相信 subclass 最終為一個類的名字就行了,像 MP3FileInfo。 | |
| 你已經了解了 getattr,它可以通過名字得到一個對象的引用。hasattr 是一個補充性的函數,用來檢查一個對象是否具有一個特定的屬性;在本例中,用來檢查一個模塊是否有一個特別的類 (然而它可以用于任何類和任何屬性,就像 getattr)。用英語來說,這行代碼是說,“If this module has the class named by subclass then return it, otherwise return the base class FileInfo (如果這個模塊有一個名為 subclass 的類,那么返回它,否則返回基類 FileInfo)”。 |
<< for 循環 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
與目錄共事 >> |