什么是模块:本质就是一个 .py 文件,封装语句的最小单位。
什么是自定义模块:实际上就是定义 .py 文件。
其中可以包括:变量定义,可执行语句,for循环,函数定义等等,他们统称模块的成员
模块的运行方式:
脚本方式:直接解释器执行。或者pycharm中右键运行。
模块方式:被其他的模块导入,为导入它的模块提供资源(函数定义,变量,类定义等。。)
自定义模块被其他模块导入时,其中的可执行语句会立即执行。
python中提供了一种可以判断自定义模块是属于脚本方式运行还是模块方式运行。
脚本方式运行时__name__
变量是固定的字符串__main__
以导入方式运行时,__name__
就是本模块的名字
系统导入模块的路径
内存中:如果之前成功导入过某个模块,直接使用已经存在的模块
内置路径中:安装路径下-->Lib文件下
sys.path:是一个模块导入路径列表,动态修改sys.path就可导入自定义模块。
1、查看 sys.path 内容
import sys print(sys.path)
2、添加自定义模块所在路径到sys.path,就可以调用了。
3、使用相对位置找到自定义函数所在文件夹
使用os模块获取一个路径的父路径,os.path.dirname(__file__
)。通常用于获取当前模块的相对路径
import os import sys # router是我需要调用的模块所在的文件 # __file__是当前文件的绝对路径 # 当前模块的相对路径加上被调用模块的路径,并添加到sys.path模块调用路径列表里 sys.path.append(os.path.dirname(__file__) +'/router')
测试函数,在开发阶段,对本模块中的功能进行测试
def main(): pass if __name__ == '__main__': main()
二、导入模块的多种方式
import xxx:导入一个 xxx 模块的所有成员。
import aaa,bbb:一次性导入多个模块的成员(不建议这样,不容易排错)
from xxx import aaa:从 xxx 模块导入 aaa 成员
from xxx import aaa,bbb,ccc :从xxx模块中导入多个成员
from xxx import *:从xxx模块中导入所有成员。
import xxx 和 from xxx import * 的区别
import xxx
要想使用模块成员时,必须把模块名作为前缀。
import my_module my_module.func()
from xxx import * :默认情况下,所有成员被导入。
要想使用模块成员时,直接使用成员名即可,容易产生命名冲突,在后定义的成员生效(把前面的覆盖)
from my_module import func func()
怎么解决名称冲突的问题
1、改用 import xxx 这种方式导入。
2、自己避免使用同名
3、使用别名解决冲突:
针对导入模块的成员使用别名,避免冲突。
from my_module import func as f func = 100 print(f)
针对导入的模块使用别名,简化书写。
import my_module as f my_module = 100 print(my_module) print(f.func)
from xxx import * :默认情况下,所有成员被导入
__all__
是一个列表,用于表示本模块可以被外界使用的成员。元素是成员名的字符串。
使用__all__
控制被导入的成员,(只能针对from xxx import * 导入方式)
__all__ = ['mod_0', 'mod_1'] # mod_0 和 mod_1 都不会被其他模块导入 func = '我的模块' mod_0 = '不想被导入' mod_1 = '不能被导入'
三、相对导入
针对某个项目中的不同模块之间进行导入,称为相对导入。
只有一种格式:
相对路径:包含点号的一个相对路径。
一个点 . 表示当前路径。
两个点 . 表示的是父路径。
三个点 . 表示的是父路径的父路径
在同一个文件夹下的不同文件夹中的模块相互导入
''' 此模块名为yy.py 此模块的父目录为y文件,也就是此模块的当前目录 y文件的父目录为xy文件,也就是y文件的当前目录 xy文件下有y文件和x文件 x文件下有xx.py模块 需要从此模块导入x文件下的xx.py模块 ''' from ..x.xx import * # 导入当前模块目录的父目录下的x文件下的xx.py模块的所有成员