模块的导入
经常有这样一句话:“不要重复造轮子”,知道别人已经造好了轮子,并且轮子也好用,那就直接拿别人的轮子来用,此处的“模块导入”就是“拿别人的轮子过来”。前文提到模块化编程的好处之一就是“代码复用性高”。写好的模块可以被反复调用,模块的导入就是“在本模块中使用其它模块”。
写文章-CSDN创作中心https://mp.csdn.net/mp_blog/creation/editor/140068975
import语句导入
import语句基本格式如下
import 模块名
import 模块1,模块2... # 导入多个模块
import 模块名 as 模块别名 # 导入模块并给导入的模块取个名字
import加载的模块分为4类:
- 使用Python编写的 .py 文件
- 已被编译为共享库或DLL的C或C++扩展
- 一组模块的包
- 使用C编写并链接到Python解释器的内置模块
通过import语句实现导入和使用模块时,本质上是使用了内置函数 __import__(),Python解释器进行执行,最终会生成一个 module类 对象,这个对象就代表了被加载的模块,且被其引用。因此,我们通过import语句导入多个模块时,本质上也就是生成多个 module类对象,而给模块起个别名本质上就是新创建一个变量引用加载的模块对象。
注意:导入多个相同模块时,只有一行语句会生效,其他的都没用。
示例代码如下
import os.path
print(id(os.path))
print(type(os.path))
代码运行结果
1749657667760
<class 'module'>
Process finished with exit code 0
from...import导入
基本语法格式如下
form 模块名 import 成员1,成员2[,...] #导入要用的成员1,成员2[,...]
form 模块名 import * #导入一个模块中所有成员
注意:尽量避免 from 模块名 import * 这种写法,因为这会导入该模块中所有不是以下划线_开头的名字全都导入当前位置。因为模块中有很多属性,很有可能导入的属性和其他属性同名,从而发生命名冲突,而且代码可读性极差。
示例代码如下
from math import pi
print(pi)
代码运行结果
3.141592653589793
Process finished with exit code 0
import 语句 和 form...import语句的区别
import 导入的是模块,from...import语句导入的是模块中的函数或类。在使用import语句导入的模块时要加 模块名,而在使用 from...import语句导入时则可以直接用函数或类名。
示例代码如下
首先定义一个Calculate.py文件,在文件中输入下面代码
"""一个简单的计算器"""
def add(*nums):
total = 0
for num in nums:
total+=num
print(f"计算的总和为:{total}")
return total
def minus(a,b):
print(f"{a}-{b}={a-b}")
return a-b
class MyCalculate():
def print_all(self,num):
print(num)
再定义一个用于测试的 .py文件,输入下面代码
import Calculate
print(Calculate.add(1,2,3))
print(Calculate.minus(3,2))
------------------------------------------------------------------------
# 上面代码等价于下面代码
from Calculate import add,minus
print(add(1,2,3))
print(minus(3,2))
代码运行结果
计算的总和为:6
6
3-2=1
1
Process finished with exit code 0
import加载底层原理
__import__()动态导入
import语句本质上就是调用内置函数 __import__(),可以给 __import__()动态传递不同的参数值,就能导入不同的模块。
示例代码如下
s = "math"
m = __import__(s) #导入模块math并将其引用赋给m
print(m.sqrt(9))
print(m.pi)
代码运行结果
3.0
3.141592653589793
Process finished with exit code 0
注意:一般不建议使用 __import__(),因为它在Python2和Python3中有差异,可能会导致意外错误。
模块的加载问题
当导入一个模块时,模块中的代码都会被执行。不过,如果再次导入改模块,则不会再次执行。因为导入模块更多的时候需要的是模块中定义的变量、函数、对象等。因此,一个模块无论导入多少次,这个模块在整个解释器进程内有且仅有一个实例对象。
重新加载
若有时候确实需要重新加载模块,可以用:importlib.reload()方法。
示例代码如下
import Calculate
import importlib
importlib.reload(Calculate)