一. 模块
定义: 如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了。为此 Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块。
模块可以分为自定义模块、内置模块和第三方模块
1.内置模块
2.第三方模块
3.自定义模块
什么叫自定义模块? 自定义模块就是你自己编写的模块 ,在Python中,其后缀名是.py 就是一个模块
-
例如: 在Pycharm里建个py文件module,写入代码:
def say_hi():
print('name')
say_hi() #这样就创建了一个模块.可以添加多个函数,跟正常的python文件一样
二. 包: 用来从逻辑上组织模块。本质就是一个目录(必须带有一个int.py文件)
为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为(Package),包名通常为全部小写,避免使用下划线.包是模块的集合,比模块又高一级的封装。没有比包更高级别的封装,但是包可以嵌套包,就像文件目录一样.
最顶层的Django包封装了contrib子包,contrib包又封装了auth等子包,auth又有自己的子包和一系列模块。通过包的层层嵌套,我们能够划分出一个又一个的命名空间。
三. 模块与包之间的互相导入
在我们的程序中,使用其它的模块(包、类、函数),就必须先导入对应的模块(包、类、函数)。在Python中,模块(包、类、函数)的导入方式有:
1.在绝对路径下,导入自定义的模块.绝对路径指在一个包文件下的.py互相导入
路径说明:core为包文件,Module_a,Main.py为core的俩个py文件
方式一 :import 模块名
比如,被导入的模块Module_a:
# Module_a.py
def func():
print("this is module A!")
在Main.py中导入Module_a:
# Main.py
import module_a #import 模块名
module_a.func() # 调用方法 模块名.函数名() #注意中间有个点
方式二:from 模块名 import 函数名
在Main.py中导入Module_a:
# Main.py
from module_a import func
module_a.func() # 错误的调用方式
func() # 这时需要直接调用func
方式三: form 模块名 import * 将对象内的所有内容全部导入
A.在Main.py中导入Module_a: 导入单个函数
from module_a import *
func()
返回:this is module A!
B.如果针对导入的模块内有多个函数.需要导入并使用:
#module_a.py
def func():
print("this is module A!")
def fun123():
print('this is fun123
在Main.py中导入Module_a: 导入多个函数
from module_a import *
func()
fun123()
返回:
this is module A!
this is fun123
C:需要注意的是:在main.py模块内定义的函数名与module_a的名称一样,就会被覆盖,尽量做到不与函数名重复.
# Main.py
from module_a import *
def func():
print("this is main module!")
func() # 从module导入的func被main的func覆盖了
2.在相对路径下导入包,包与包之间的相互调用:
路径说明:在图中 modile11, bin, core 都是包,并且bin和core是modile11的子包 .
在这种相对路径下导入,子包与子包的相互调用,需要用到os,sys模块将路径添加到环境变量里.
以图为例子:在子包bin文件下的`run.py`文件要导入core子包的`module_a.py`文件信息. 就要先找到`bin`,`core`的共同父级目录
添加到环境变量
import os
import sys
DIR =os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print(DIR)
sys.path.append(DIR)
比如,被导入的模块Module_a:
# Module_a.py
def func():
print("this is module A!")
#def fun123():
# print('this is fun123')
方式一: from 包名 import 模块名
from core import module_a
module_a.func() #调用方法 模块名.函数名()
module_a.fun123() #针对module_a模块内有多个函数也可这样使用
返回:
this is module A!
方式二: from 包名. 模块名 import *
from core.module_a import *
func() #调用方法 函数名()
#fun123() #针对module_a模块内有多个函数也可这样使用
返回:
this is module A!
需要注意的是:
在包与包之间的导入,在实际应用中用的比较多,如果被导入的模块函数比较多,也可这样使用.
四:模块搜索路径
模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块
Python根据sys.path的设置,按顺序搜索模块。
当然,这个设置是可以修改的,就像windows系统环境变量中的path一样,可以自定义。 通过sys.path.append('路径')的方法为sys.path路径列表添加你想要的路径。 如 图中,添加到环境变量的例子.