2.4 import()动态导入
import 语句本质上就是调用内置函数__import__(),我们可以通过它实现动态导入,即给__import__()动态传递不同的的参数值,就能导入不同的模块。
【例】使用__import__()动态导入指定的模块
s = 'math'
m = __import__(s) # 导入后生成的模块对象引用给变量m
print(m.pi)
运行结果:
注意:一般不建议我们自行使用__import__()导入,其行为在 python2 和 python3 中有差异,会导致意外错误。如果需要动态导入可以使用 importlib 模块。
【例2】使用Python官方推荐的importlib实现动态导入
import importlib
a = importlib.import_module('math')
print(a.pi)
2.5 模块的加载问题
当导入一个模块时, 模块中的代码都会被执行。不过,如果再次导入这个模块,则不会再次执行。
Python 的设计者为什么这么设计?因为,导入模块更多的时候需要的是定义模块中的变量、 函数 、对象等。 这些并不需要反复定义和执行。“只导入一次(import-only-once)”就成了一种优化。
一个模块无论导入多少次,这个模块在整个解释器进程内有且仅有一个实例对象。
【例】
.1
test02.py 的源代码:
print('test02正在被加载...')
def add(a, b):
return a + b
.2
在test03中执行以下代码
import test02
运行结果:
分析:
这个运行结果进一步向我们展示了,import的行为其实就是在程序中执行一遍import模块中的代码。
.3
若在test03中运行以下代码:
import test02
import test02
import test02
运行结果:
分析:
由此结果可见,import test02的执行只执行了一遍,可以印证:
一个模块无论导入多少次,这个模块在整个解释器进程内有且仅有一个实例对象。
重新加载
有时候我们确实需要重新加载一个模块,这时候可以使用:importlib.reload()方法:
【例】
import test02
import test02
print('###############')
import importlib
importlib.reload(test02)
运行结果: