20201223_147_import加载底层原理_importlib模块

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)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值