Day08 - 模块
1.模块
1.1定义
模块就是一系列功能的集合体,分为三大类(内置模块、第三方模块、自定义模块)一个python文件就是一个模块,文件名叫m.py模块名叫m
模块分为四种形式:
- 使用python编写的.py文件
- 已被编译为共享库或DLL的C或C++扩展
- 把一系列模块组织到一起的文件夹(注:文件夹下有–init–.py文件,该文件称为包)
- 使用C编写并链接到python解释器的内置模块
为何要有模块?
1.内置与第三方模块拿来就用,无需定义,这种拿来主义,可以极大地提高自己的开发效率
2.自定义模块:可以将程序的各部分功能提取出来放到一模块中为大家共享使用
好处是减少代码冗余,程序组织结构更加清晰
1.2使用
#文件名foo.py
x=1
print('foo>>>>>>>>>>>>')
def get():
print(x)
def change():
global x
x=0
class Foo:
def func(self):
print('from the func')
首次导入的三件事
- 执行foo.py
- 产生foo.py的名称空间,将foo.py运行过程中产生的名字都丢到foo的名称空间中
- 在当前文件中产生的名称空间有一个foo,该名字指向2中产生的名称空间
之后的导入,都是直接引用首次导入产生的名称空间,不会重复代码
如何引用:
foo.变量名/函数名()
强调1:指名道姓地问某一模块要名字对应的值,不会与当前名称空间中名字发生冲突
强调2:无论查看还是修改都是以原模块为基准,与调用位置无关
1.3 导入模块
#一般用
import model1
import model2
#一行导入
import model1,model2#用逗号分割
#规范:内置>第三方>自定义
#别名
import model1 as 名
#自定义模块的命名应采用纯小写+下划线的风格(py3)
#也可以在函数内导入模块
1.4python文件两种用途
- 当成文件运行
- 当成模块运行
1.5 其他导入方式
#格式:from 模块名 import 函数
from foo import x
#x为当前文件的函数,但其所指向的内存地址是foo模块中所对应函数的内存地址
#发生的三件事
#1.产生一个模块的名称空间
#2.产生foo.py的名称空间,将foo.py运行过程中产生的名字都丢到foo的名称空间中
#3.在当前名称空间拿到一个名字,该名字与模块名称空间中的某一个内存地址相对应
from foo import *#大多数不建议
__all__=[]#列表存入的是模块中的函数名
#起别名
from foo import get as g
#循环导入(一个不要放到全局,放到函数内)
2.模块的搜索
模块查找优先级: 1.内存(内置)>2.硬盘(按照sys.path中存放的文件的顺序依次查找)
sys.modules()查看以及加载到内存的模块
3.包
包含有–init–.py的文件
包的本质是模块的模块的一种形式,包使用来被当做模块导入(python3不会报错)
3.1使用包
包的导入,相当于导入–init–.py文件
#在__init__.py中添加
#绝对导入:以包的文件夹作为起始来进行导入
from foo.m1 import f1
from foo.m2 import f2
from foo.m3 import f3
#环境变量是以执行文件为准的,所有被导入的模块或者后续的其他文件的sys.path都是参照执行文件的sys.path
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#相对导入
.代表当前文件夹
..代表代表上一层文件夹
#包内导入推荐相对导入
#相对导入不能跨出包;绝对导入没有限制,所以绝对导入是一种通用的导入方式
强调:
关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如import 顶级包.子包.子模块,但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。
#例如 from foo.a.b.c.d.e.f import f1,f2,f3
#foo/a/b/c/d/e都是包名
2、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间
import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件