您当前位置:首页 > 深入 Python > 异常和文件处理 > 使用 sys.modules | << >> | ||||
深入 Python从 Python 新手到专家 |
与 Python 中的所有其他内容一样,模块也是对象。导入后,您始终可以通过全局字典 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 字典一起使用,以获取对定义类的模块的引用。
>>> from fileinfo import MP3FileInfo >>> MP3FileInfo.__module__'fileinfo' >>> sys.modules[MP3FileInfo.__module__]
<module 'fileinfo' from 'fileinfo.pyc'>
![]() |
每个 Python 类都有一个内置的类属性 __module__,它是定义该类的模块的名称。 |
![]() |
将其与 sys.modules 字典结合使用,您可以获取对定义类的模块的引用。 |
现在,您准备好在第 5 章中介绍的示例程序 fileinfo.py 中查看如何使用 sys.modules。此示例显示了代码的那一部分。
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 是可选的,默认为包含 FileInfo 类的模块。这看起来效率低下,因为您可能希望 Python 每次调用该函数时都计算 sys.modules 表达式。实际上,Python 只在第一次导入模块时计算一次默认表达式。您稍后会看到,您永远不会使用 module 参数调用此函数,因此 module 充当函数级常量。 |
![]() |
在深入了解 os 模块之后,您将仔细研究这一行。现在,请相信 subclass 最终会成为一个类的名称,例如 MP3FileInfo。 |
![]() |
您已经了解了getattr,它通过名称获取对对象的引用。hasattr 是一个补充函数,用于检查对象是否具有特定属性;在本例中,是检查模块是否具有特定类(尽管它适用于任何对象和任何属性,就像 getattr 一样)。用中文来说,这行代码的意思是:“如果此模块具有 subclass 命名的类,则返回它,否则返回基类 FileInfo。” |
<< 使用 for 循环迭代 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
使用目录 >> |