返回介绍

模块是对象:元程序

发布于 2024-01-29 22:24:15 字数 2169 浏览 0 评论 0 收藏 0

因为模块通过内置属性显示了它们的大多数有趣的特性,因此,可很容易地编写程序来管理其他程序。我们通常称这类管理程序为元程序(metaprogram),因为它们是在其他系统之上工作。这也称为内省(introspection),因为程序能看见和处理对象的内部。内省是高级功能,但是,它可以用做创建程序的工具。

例如,要取得M模块内名为name的属性,可以使用结合点号运算,或者对模块的属性字典进行索引运算(在内置__dict__属性中显示)。Python也在sys.modules字典中导出所有已加载的模块的列表(也就是sys模块的modules属性),并提供一个内置函数getattr,让我们以字符串名来取出属性(就好像是object.attr,而attr是运行时的字符串)。因此,下列所有表达式都会得到相同的属性和对象。

通过像这样揭示了模块的内部机制,Python可帮助你建立关于程序的程序[1]。例如,以下是名为mydir.py的模块,运用这些概念,可以实现定制版本的内置函数dir。它定义并导出了一个名为listing的函数,这个函数以模块对象为参数,打印该模块命名空间的格式化列表。

注意顶端的文档字符串,就像在前面的formats.py示例中一样,因为我们可能想要将其用作一个通用的工具,编写一个文档字符串来提供通过__doc__属性或help函数可以访问的功能性信息(参见第15章了解详细内容)。

我们在这个模块的最后也提供了自测试逻辑,它导入并列出自己。这里给出了在Python 3.0中产生的输出(要在Python 2.6中使用它,使用第11章介绍的__future__import导入来激活Python 3.0 print调用,end关键字只用于Python 3.0):

要使用这一工具来列出其他的模块,直接把模块作为对象传入到这个文件的函数中。这里,它列出了标准库中的tkinter GUI模块中的属性(即Python 2.6中的tkinter):

稍后我们会再遇见getattr以及与它作用相似的操作。重点就在于mydir是一个可以浏览其他程序的程序。因为Python能够展现其内部,通常可以像这样处理各种对象[2]

[1]如第17章所看到的,因为函数可以像这里一样通过sys.modules表来获得它所在模块,所以,模拟global语句的效果是有可能的。例如,global X。X=0的效果可在函数内这样写以进行模拟(只不过要输入比较多的字):import sys;glob=sys.modules[__name__];glob.X=0。记住,每个模块都可取得__name__属性,在模块内的函数中,这是可见的全局变量。这个技巧还有另一种方式,可以修改函数内同名的局部变量和全局变量。

[2]像mydir.listing这类工具可以由PYTHONSTARTIP环境变量所引用的文件进行导入,预先在交互模式的命名空间中加载。因为在启动文件内的程序代码会在交互模式命名空间内(模块__main__)执行,在启动文件内导入常用工具,可以节省一些输入。参考附录A以获得更多细节。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文