Python--day17(包)
今日主要内容
1. 导入模块的细节
2. 包的概念和使用
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。3. 包中的相对导入语法
1. 导入模块的细节
1.1 跨文件导入模块
1. 如果a文件夹所在目录在环境变量,a文件夹中的ma模块可以被以下方式导入
import a.ma | from a import ma
2. 如果a文件夹所在目录在环境变量,a文件夹中的b文件夹的mb模块可以被以下方式导入
import a.b.mb | from a.b import mb
3. 如果a文件夹所在目录在环境变量,a文件夹中的b文件夹的mb模块中的bbb名字要被直接导入
import a.b.mb.bbb 这是不正确的, 所有 . 左侧必须为文件夹(*****)
from a.b import mb.bbb 这是不正确的, 所有 . 左侧必须为文件夹
froma.b.mb inport bbb 正确
1.2 模块的两种被执行方式
自执行模块在导入被导入的模块时,有些被导入的模块中的代码为测试代码,忘记删除了,为了不让在自执行的模块中显示出在被导入模块的测试内容
可以同__name__这个方法
1. 一个py文件作为自执行文件,__name__变量值为'__main__'
2. 一个py文件作为模块被导入执行,__name__变量的值为'文件(模块)名'
即:在被导入的模块中只有 print(__name__)结果为__main__
在自执行模块中import被导入模块,直接运行结果为被导入模块的模块名
如何区别两种方式,可以让一个文件可以自执行,也可以被导入执行 共存
在这样的py文件中写:
if __name__ == '__main__':
自执行的逻辑 => 因为在文件作为模块使用时 __name__为文件名,不满足条件
pass
2. 包
包:一系列模块的集合体:用文件夹管理一系列有联系功能的模块,该文件夹我们称之为包,文件夹名就是包名
包与普通文件夹区别:报i的文件夹中一定存在一个__init__.py文件
py2:必须自己创建, py3:建议创建,不创建系统会自动创建
__init__.py文件
1)产生一个全局名称空间,提供给包的,就代表包的名称空间
2)管理包可以直接点出来使用的名字,凡是能通过包名能点出来名字,一定存在与包的__init__.py文件中
导包完成的三件事
1)编译形成包中__init__.py文件的pyc文件
2)执行__init__.py文件,形成一个全局名称空间,将__init__.py文件中所有名字存放其中,改名称空间就是代表包的名称空间
3)在导包的文件中,产生一个与包名相同的名字,指向包的名称空间(__init__.py)文件的全局名称空间
直接使用包中模块
如果像作为普通文件夹,py3中可以省略__init__.py文件,本质上文件夹也是包
导入的手段:1. 指名道姓到摸一个模块 2. 指名道姓到摸一个模块的名字
3. 包的管理
在包中采用相对导入管理模块或模块的名字
可以直接通过包名使用包中的摸一个模块
可以直接通过包名使用包中的摸一个模块中的名字
可以直接通过包名使用包中子模块中的名字
在包中管理模块,或者模块与模块之间功能相互作用,通过from .开头 import 语法导入
在包的__init__.py文件或是包中任意一个模块中
. 代表当前文件夹所在目录
.. 代表当前文件所在目录的上一级目录
【注】语法不能出包,因为包外的文件都能自执行,但拥有 . 开头导入的文件不能自执行
案例分析:
逻辑框架
各个模块代码:
t1:
import a
# 可以直接通过包名使用包中的某一个模块
print(a.a1) #__init__.py中有 from . import a1
print(a.a1.a) # 10
print(a.a1.b) # 20
print(a.a1.c) # 30
# 可以直接通过包名使用包中的某个模块中的名字
# from .a2 import x,y,z
print(a.x) # 111
print(a.y) # 222
print(a.z) # 333
# 可以直接通过包名使用包中子包模块中的名字
# from .bb.bb1 import i,j,k
# from .cc.cc1 import qqq
print(a.i) # 100
print(a.j) # 200
print(a.k) # 300
print(a.bb1.i) # 100
print(a.qqq) # 111223
a.fn()
__init__.py
from . import a1
from .bb import bb1
from .a2 import x,y,z
from .bb.bb1 import i,j,k
from .cc.cc1 import qqq
from .cc.cc2 import fn
a1:
a = 10
b = 20
c = 30
a2:
x = 111
y = 222
z = 333
bb1:
i = 100
j = 200
k = 300
cc1:
qqq = 111223
cc2:
from .cc1 import qqq
from ..bb.bb1 import i,j,k
def fn():
print('cc2 fn run') # cc2 fn run
# 要使用cc1中的qqq
print('cc1>>>',qqq) # cc1>>> 111223
#要使用 bb1中的i,j,k
print('bb1>>>',i,j,k) # bb1>>> 100 200 300
