2. 模块的导入
模块化设计的好处之一就是“代码可复用性高”。写好的模块可以被反复调用,重复使用。模块的导入就是“在本模块中使用其他模块”。
2.1 import 语句导入
import 语句的基本语法格式如下:
import 模块名 #导入一个模块
import 模块 1,模块 2… #导入多个模块
import 模块名 as 模块别名 #导入模块并使用新名字
import 加载的模块分为四个通用类别:
- 使用 python 编写的代码(.py 文件);
- 包好一组模块的包;
- 使用 C 编写并链接到 python 解释器的内置模块;
- 已被编译为共享库或 DLL 的 C 或 C++扩展。
我们一般通过 import 语句实现模块的导入和使用,import 本质上是使用了内置函数__import__()。
当我们通过 import 导入一个模块时,python 解释器进行执行,最终会生成一个对象,这个对象就代表了被加载的模块。
【例】导入模块对象
import math
print(id(math))
print(type(math))
print(math.pi) # 通过math.成员名来访问模块中的成员
运行结果:
从上面的例子,我们可以看到 math 模块被加载后,实际会生成一个 module 类的对象,该对象被 math 变量引用。我们可以通过 math 变量引用模块中所有的内容。
我们通过 import 导入多个模块,本质上也是生成多个 module 类的对象而已。
有时候,我们也需要给模块起个别名,本质上,这个别名仅仅是新创建一个变量引用加载的模块对象而已。
【例2】导入模块对象并别名化
import math as m
# 等效于
# import math
# m = math
print(m.sqrt(4))
运行结果:
2.2 from…import 导入
Python 中可以使用 from…import 导入模块中的成员。基本语法格式如下:
from 模块名 import 成员 1,成员 2,…
如果希望导入一个模块中的所有成员,则可以采用如下方式:
from 模块名 import *
注意:尽量避免“from 模块名 import *”这种写法。它表示导入模块中所有的不是以下划线开头的名字都导入到当前位置。 但你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差。一般生产环境中尽量避免使用,学习时没有关系。
【例】使用 from…import 导入模块指定的成员
from math import pi, sin
print(sin(pi / 2))
运行结果:
2.3 import 语句和 from…import 语句的区别
import 导入的是模块。from…import 导入的是模块中的一个函数/一个类。
如果进行类比的话,import 导入的是“文件”,我们要使用该“文件”下的内容,必须前面加“文件名称”。from…import 导入的是文件下的“内容”,我们直接使用这些“内容”即可,前面再也不需要加“文件名称”了。
【例】
我们自定义一个模块 calculator.py
.1
"""一个实现四则运算的计算器"""
def add(a, b):
return a + b
def minus(a, b):
return a - b
class MyNum:
@staticmethod
def print123():
print(123)
我们在另一个模块 test.py 测试:
.2 导入模块
import Calculate
a = Calculate.add(30, 40)
# add(100, 200) # 不加模块名无法识别
print(a)
运行结果:
.3 导入模块中的指定成员
from Calculate import *
a = add(30, 40) # 无需模块名,可以直接引用里面的函数/类
print(a)
b = MyNum()
b.print123()
运行结果: