多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] --- ## 概述 模块程序代码默认只对每个过程执行一次,如果要重载,需要使用内置函数reload进行重载。 ### 为什么使用重载? reload函数可以修改程序的一部分,而无需停止整个程序。使用reload可以立即看到组件的修改效果。并且reload只能用在python编写的模块,C语言编写的编译后的苦鏖战模块也可在执行中动态加载,但无法重载。 > python2.6 realod作为内置函数,python3的reload在imp模块中。 ### realod基础 reload会在模块当前命名空间内执行模块文件的新代码; 文件中顶层赋值语句会使得变量名换成新值; 重载只会影响所有使用import读取了模块的客户端; >因为使用import客户端需要通过`点`号运算符取出属性,重载后,变量会变成了新值。 重载只会对以后使用from客户端造成影响; > 之前使用from来读取属性的客户端并不会受到重载的影响,哪些客户端依然是重载前的旧的对象。 ### reload实例 编写模块 mod.py ```python message = 'first version' def printter(): print(message) ``` 第一次import ```python >>> import mod >>> mod.printer() first version ``` 修改 mod.py ```python message = 'second version' def printter(): print(message) ``` 第二次import,属性不变 ```python >>> import mod >>> mod.printer() first version ``` 使用reload重载,属性改变 ```python >>> from imp import reload >>> reload(mod) >>> mod.printer() second version ``` ### 用名称字符串导入模块 import无法使用以字符串形式给出的模块名称,如下 `import "string" 和x = "string"; import x` 这里两种都不能执行 解决方案 1 exec()函数会编译一个代码字符串,并且将其传递给python解释器执行。缺点是:每次运行时必须编译import语句 `modname = "string"` `exec("import " + modname)` 或者 2 代码运行速度会快于exec() `modname = "string"` `string = __import__(modname)`