今日主要内容

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被导入模块,直接运行结果为被导入模块的模块名

Python--day17(包) 随笔 第1张Python--day17(包) 随笔 第2张

如何区别两种方式,可以让一个文件可以自执行,也可以被导入执行 共存

 

在这样的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文件或是包中任意一个模块中

. 代表当前文件夹所在目录

.. 代表当前文件所在目录的上一级目录

【注】语法不能出包,因为包外的文件都能自执行,但拥有  .  开头导入的文件不能自执行

 

案例分析:

逻辑框架

Python--day17(包) 随笔 第3张

各个模块代码:

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

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄