一、模块
1.模块的定义
python模块(Module),就是一个python文件,以.py结尾,包含了对python对象定义和python语句
作用:
模块让你能够有逻辑地组织你的Python代码段。
模块能定义函数,类和变量,模块里也能包含可执行的代码。
2.模块的导入
定义好模块之后
可以用
1)import语句导入
一次可以导入多个方法
导入的本质: 将这个文件执行了一遍以后,保存到模块中。
(这样效率不太高,文件里面可能会有用不到的方法就会被执行了)
格式 import module_test ==> py module_test 把结果执行给了 ==> module_test模块
模块的优化
2)from语句导入
导入哪个模块里面的哪个方法
导入的本质: 把对应文件里面的对应方法做了定义
as 可定义别名 避免模块里面的方法和本地的冲突
格式 from 模块 import 方法 as 别名
module_test文件
def bar():
print('this is a test from bar...')
def pol():
print('this is a test from pol')
test文件
from day11.module_test import bar as test_bar,pol as test_pol
test_bar()
test_pol()
结果就可以执行出来了
3)from module_test import * 导入模块里面的所有方法
(一般不这么用)
3.模块的分类
1)标准库 F:\python373\Lib
2)第三方模块 F:\python373\Lib\site-packages
3)自定义模块 F:\python373\Lib\site-packages(一般放在这个路径)
二、python包
1.包的定义
本质就是个目录
(必须带有一个_init.py_的文件,从逻辑上组织模块)
2.包的导入
init.py:在调用该包的内容之前做一些初始化的配置
init.py:运行时,当前的目录没有发生变化
要导入的时候必须在这个文件把导入的模块也导入一遍
在这之前引入一个环境变量和环境变量加载的顺序
打印出系统的环境变量 sys模块 所以要先导入
import sys
print(sys.path)
可以看出以列表的形式打印出来了
print(sys.path)
['F:\\pycharm\\Documents\\day11\\atm', 当前路径
'F:\\pycharm\\Documents',
'F:\\python373\\python37.zip',
'F:\\python373\\DLLs',
'F:\\python373\\lib',
'F:\\python373',
'F:\\python373\\lib\\site-packages']
还有模块的执行顺序也就是环境变量加载的顺序:
- 首先在当前路径下找模块,因为默认在环境变量里有当前路径
2)当前下没有,就去加载的环境变量中找模块
3)在环境变量中也没有找到,系统就会去模块库中查找
import 导入包的时候 因为没有环境变量 所以要导进去
就有了动态加载环境变量
(环境变量随文件的位置的变化而变化)
包的结构如图 我们想导入atm的包
因为环境变量里面没有day11的目录 所以找不到
因此要动态加载目录到环境变量里面
import os,sys
print(sys.path)
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(file)))
sys.path.append(base_dir)
print(sys.path)
time_test.py文件为
def time():
print('this a test from atm')
test_admin.py文件为
import os,sys
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir)
print(sys.path)
import time_test
time_test.time()
结果就可以显示了
注意:
- 环境变量动态加载上之后,才可以导入模块。
- 加载模块时,只在环境变量的当前目录下找模块,不会到环境变量下级目录下找
这里可以做个测试
包目录如图
day11下的和atm下的 time_test文件为
def time1():
print('this is a test from atm...')
atm下的 time_test文件为
def time1():
print('this is a test from day11/')
atm下的test文件为
import sys,os
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir)
import time_test
time_test.time1()
然后运行这个文件
会发现不动态添加环境变量 也能运行出来
this is a test from atm...
那是因为环境变量第一个就是在当前路径下找模块 所以就找到这个文件了
这个时候把atm下的time_test文件的名字随便一改
运行这个文件 会发现
this is a test from day11/
这个就是动态添加的环境变量影响的
2)from day11.atm import main
这个就不用说了 跟模块的一样 导入