导航: 起始页 > Dive Into Python > 异常和文件处理 > 使用 sys.modules | << >> | ||||
Python 研究(Dive Into Python)Python 从新手到高手 [DIP_5_4_CPUG_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'>
下面的例子介绍 sys.modules dictionary 的 __module__ 属性,可以作为理解已定义类中 __module__ 属性的参考。
>>> 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 | |
与 Directory 共事 >> |