当前位置:   article > 正文

20201223_147_import加载底层原理_importlib模块_python import加载底层原理_importlib实现动态导入

python import加载底层原理_importlib实现动态导入

2.4 import()动态导入

import 语句本质上就是调用内置函数__import__(),我们可以通过它实现动态导入,即给__import__()动态传递不同的的参数值,就能导入不同的模块。

【例】使用__import__()动态导入指定的模块

s = 'math'

m = __import__(s)  # 导入后生成的模块对象引用给变量m

print(m.pi)
  • 1
  • 2
  • 3
  • 4
  • 5

运行结果:
在这里插入图片描述
注意:一般不建议我们自行使用__import__()导入,其行为在 python2 和 python3 中有差异,会导致意外错误。如果需要动态导入可以使用 importlib 模块。

【例2】使用Python官方推荐的importlib实现动态导入

import importlib

a = importlib.import_module('math')

print(a.pi)
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

2.5 模块的加载问题

当导入一个模块时, 模块中的代码都会被执行。不过,如果再次导入这个模块,则不会再次执行。
Python 的设计者为什么这么设计?因为,导入模块更多的时候需要的是定义模块中的变量、 函数 、对象等。 这些并不需要反复定义和执行。“只导入一次(import-only-once)”就成了一种优化。

一个模块无论导入多少次,这个模块在整个解释器进程内有且仅有一个实例对象。

【例】
.1
test02.py 的源代码:

print('test02正在被加载...')


def add(a, b):
    return a + b
  • 1
  • 2
  • 3
  • 4
  • 5

.2
在test03中执行以下代码

import test02
  • 1

运行结果:
在这里插入图片描述
分析:
这个运行结果进一步向我们展示了,import的行为其实就是在程序中执行一遍import模块中的代码。
.3
若在test03中运行以下代码:

import test02
import test02
import test02
  • 1
  • 2
  • 3

运行结果:
在这里插入图片描述
分析:
由此结果可见,import test02的执行只执行了一遍,可以印证:
一个模块无论导入多少次,这个模块在整个解释器进程内有且仅有一个实例对象。

重新加载

有时候我们确实需要重新加载一个模块,这时候可以使用:importlib.reload()方法:

【例】

import test02
import test02

print('###############')
import importlib
importlib.reload(test02)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

运行结果:
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/272221
推荐阅读
相关标签
  

闽ICP备14008679号