- 译者序
- 前言
- 第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 各部分练习题的解答
- 作者介绍
- 封面介绍
重载模块
·导入(无论是通过import或from语句)只会模块在流程中第一次导入时,加载和执行该模块的代码。
·之后的导入只会使用已加载的模块对象,而不会重载或重新执行文件的代码。
·reload函数会强制已加载的模块的代码重新载入并重新执行。此文件中新的代码的赋值语句会在适当的地方修改现有的模块对象。
为什么要这么麻烦去重载模块?reload函数可以修改程序的一些部分,而无须停止整个程序。因此,利用reload,可以立即看到对组件的修改的效果。重载无法用于每种情况,但是能用时,可缩短开发的流程。例如,想象一下,数据库程序必在启动时连接服务器,因为程序修改或调整可在重载后立即测试,在调试时,只需连接一次就可以了。长时间运行的服务器可以以这种方式更新自己。
因为Python是解释性的(或多或少),其实已经避免了类似C语言程序执行时所需的编译/连接步骤:在执行程序导入时,模块会动态加载。重载进一步地提供了性能优势,让你可以修改执行中的程序的一部分,而不需要中止。注意:reload当前只能用在Python编写的模块;用C这类语言编写的编译后的扩展模块也可在执行中动态加载,但无法重载。
注意:版本差异提示:在Python 2.6中,reload作为一个内置函数使用。在Python 3.0中,它已经移入了imp标准库模块中——在Python 3.0中叫做imp.reload。这直接意味着,需要一条额外的import语句或from语句来载入该工具(仅在Python 3.0中)。使用Python 2.6的读者可以在本书的示例中忽略这些导入,或者总是使用它们——Python 2.6在其imp模块中也有一个reload,以便更容易地迁移到Python 3.0。无论其如何封装,重载都一样地工作。
reload基础
与import和from不同的是:
·reload是Python中的内置函数,而不是语句。
·传给reload的是已经存在的模块对象,而不是变量名。
·reload在Python 3.0中位于模块之中,并且必须导入自己。
因为reload期望得到的是对象,在重载之前,模块一定是已经预先成功导入了(如果因为语法或其他错误使得导入没成功,你得继续试下去,否则将无法重载)。此外,import语句和reload调用的语法并不相同:reload需要小括号,但import不需要。重载看起来如下所示。
一般的用法是:导入一个模块,在文本编辑器内修改其原代码,然后将其重载。当调用reload时,Python会重读模块文件的源代码,重新执行其顶层语句。也许有关reload所需要知道的最重要的事情就是,reload会在适当的地方修改模块对象,reload并不会删除并重建模块对象。因此,程序中任何引用该模块对象的地方,自动会受到reload的影响。下面是一些细节。
·reload会在模块当前命名空间内执行模块文件的新代码。重新执行模块文件的代码会覆盖其现有的命名空间,并非进行删除而进行重建。
·文件中顶层赋值语句会使得变量名换成新值。例如,重新执行的def语句会因重新赋值函数变量名而取代模块命名空间内该函数之前的版本。
·重载会影响所有使用import读取了模块的客户端。因为使用import的客户端需要通过点号运算取出属性,在重载后,它们会发现模块对象中变成了新的值。
·重载只会对以后使用from的客户端造成影响。之前使用from来读取属性的客户端并不会受到重载的影响,那些客户端引用的依然是重载前所取出的旧对象。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论