- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非ASCII文本
- 编码和解码非ASCII文本
- 其他 Unicode 编码技术
- 转换编码
- 在 Python 2.6 中编码 Unicode 字符串
- 源文件字符集编码声明
- 使用 Python 3.0 Bytes 对象
- 序列操作
- 创建 bytes 对象的其他方式
- 混合字符串类型
- 使用 Python 3.0(和 Python 2.6)bytearray 对象
- 使用文本文件和二进制文件
- Python 3.0 中的文本和二进制模式
- 类型和内容错误匹配
- 使用 Unicode 文件
- 在 Python 3.0 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
模块是对象:元程序
例如,要取得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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论