模块的定义和导入
模块(Module),是一个Python文件,以.py结尾。模块能定义函数,类和变量,模块里也能包含可执行的代码。
模块的作用: python中有很多各种不同的模块,每一个模块都可以帮助我们快速的实现一些功能,比如实现和时间相关的功能就可以使用time模块我们可以认为一个模块就是一个工具包,每一个工具包中都有各种不同的工具供我们使用进而实现各种不同的功能.
大白话:模块就是一个Python文件,里面有类、函数、变量等,我们可以拿过来用(导入模块去使用)
模块的导入方式
模块在使用前需要先导入,语法如下:
1
2
3
4
5
6
7
|
[from 模块名] import [模块 | 类 | 变量 | 函数 | *] [as 别名] # 中括号指可选内容
# 常用的组合形式如:
import 模块名
from 模块名 import 类、变量、方法等
from 模块名 import *
import 模块名 as 别名
from 模块名 import 功能名 as 别名
|
import 模块名:
基本语法(Quickstart):
1
2
3
4
5
6
|
# 导入时间模块
import time
print('开始运行')
# 让程序睡眠5秒(阻塞)
time.sleep(5) # 注意此处语法是 模块名.方法名
print('运行结束')
|
from 模块名 import 功能名:
基本语法(Quickstart):
1
2
3
4
5
6
|
# 导入时间模块的sleep方法
from time import sleep
print('开始运行')
# 让程序睡眠5秒(阻塞)
sleep(5) # 注意此处语法是直接调用方法名
print('运行结束')
|
from 模块名 import *:
基本语法(Quickstart):
1
2
3
4
5
|
# 导入时间模块的全部功能
from time import * # *表示全部的意思
print('开始运行')
sleep(5) # 注意此处语法是直接调用方法名
print('运行结束')
|
as定义别名
基本语法(Quickstart):
1
2
3
4
5
|
#模块别名
import time as t
print('hi')
t.sleep(3)
print('hello')
|
1
2
3
4
5
|
# 功能别名
from time import sleep as s
print('hi')
s(3)
print('hello')
|
自定义模块并导入
制作自定义模块
示例 Quickstart:
创建模块文件module.py
1
2
|
def test(a,b):
print(a + b)
|
创建主文件main.py
1
2
|
import module
module.test(1,2)
|
注意:当导入多个模块的时候。且模块内有同名功能,当调用这个同名功能的时候,调用的是后导入的模块的功能
例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 模块1 module1.py
def test(a,b):
print(a + b)
# 模块2 module2.py
def test(a,b):
print(a - b)
# 导入模块和调用功能代码
from module1 import test
from module2 import test
# 实际test函数是模块2中的函数
test(1,2) # 输出 -1
|
特殊变量的使用
__main__变量的使用
有些时候开发者编写好一个自定义模块后为了方便测试会直接在模块文件中写一些测试语句方便直接F5测试。
但是这时如果将模块导入到其他项目中时那些测试语句也会被执行,所以我们需要一种方法使得直接运行模块文件时测试语句能正常运行,但是以导入模块的方式调用时又不会触发测试语句,因此我们需要使用__main__变量
例如(Quickstart):
1
2
3
4
5
6
7
8
9
10
|
# 模块文件module.py
def test(a,b):
print(a + b)
if __name__ == '__main__':
test(1,2)
# 主文件
from module import test
test(3,4) # 这样只会输出7
|
原理解释:任何文件在直接执行(如F5调试、双击运行)时其__name__参数的值都为__main__,但是在作为模块导入时其__name__参数的值是它自己的模块名,再结合上面的if代码,当文件直接运行时if为真所以运行下面的测试语句,当通过导入模块调用时,if不为真,进而不会执行接下来的代码
__all__变量的使用
__all__变量是一个列表,里面包括了可以被导入的模块,如果一个模块文件中有__all__变量,当使用from xxx import *导入时,只能导入这个列表中的元素
例如(Quickstart):
1
2
3
4
5
6
7
8
9
10
11
|
# 模块文件module.py
__all__ = ['testA']
def testA(a,b):
print(a + b)
def testB(a,b):
print(a - b)
# 主文件
from module import *
testA(1,2)
|
但是__all__变量并不妨碍你通过from module import testB指明某个方法来导入
例如(Quickstart):
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 模块文件module.py
__all__ = ['testA']
def testA(a,b):
print(a + b)
def testB(a,b):
print(a - b)
# 主文件
from module import *
from module import testB
testA(1,2)
testB(3,4)
|