返回介绍

重载模块

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

正如我们所见到过的,模块程序代码默认只对每个过程执行一次。要强制使模块代码重新载入并重新运行,你得刻意要求Python这么做,也就是调用reload内置函数。本节中,我们要探索如何使用reload让系统变得更加动态。简而言之:

·导入(无论是通过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 技术交流群。

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

发布评论

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