1.包的概念
包是一个分层的文件目录结构,它定义了一个由模块及子包和子包下的子包等组成的Python的应用环境。
当文件夹被当作包使用时,文件夹中需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串 。__init__.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值, __all__是在from package.module import *这语句使用的,表示全部导入定义过的模块
2.包的目录结构
例:
test/
__init__.py
common_util.py
test01/
__init__.py
Pots.py
test02/
__init__.py
Gets.py
导入方式:
①----from-import导入包, 然后使用属性/点操作符向下引用
A.from test import test01
test01.Posts.add(a,b)
B.from test.test01 import Posts
Posts.add(a,b)
C.from test.test01.Posts import add
add(a,b)
②----import 导入
import test.test01.Posts
test.test01.Posts.add()
3.包的使用
①在一个包下,可以通过__init__.py来限定可执行的模块
例:包的目录
建立一个testdemo的目录,目录中有3个文件: a.py、b.py、__init__.py
test02.py
from testdemo import *
print(a.x)
print(a.add(2,8))
执行结果:
1
10
from testdemo1122 import *
print(b.x)
执行结果:#__init__.py文件 __all__定义了可执行的模块仅有a模块
Traceback (most recent call last):
File "e:\\pyScripts\\test02.py", line 4, in <module>
print(b.x)
NameError: name 'b' is not defined
②在__init__.py里利用from-import语句导入包。执行时,再次导入(import testdemo1122)包后,包里所有模块中的方法或属性就全部可用了
执行结果:
3
1
③在__init__.py里利用import语句导入包
执行结果:
3
1
4.包的相对路径引用
包结构如下:
Test
__init__.py
test1
__init__.py
a.py
b.py
test2
__init__.py
d.py
包内引用如果是子包内的引用,可以按相对位置引入子模块以b模块为例,可以引用如下:
1 from . import a # 同级目录导入a
2 from .. import test2 # 上级目录导入test2
3 from ..test2 import d # 上级目录的test2模块下导入d
5.包的总结
➢导入一个模块时,会执行这个模块
➢导入一个包,其实就是导入包的__init__.py模块
➢__init__.py模块,可以定义__all__列表变量,控制from package import * 导入的模块
➢如果包的__init__.py模块为空,只能使用import package.module或者 from package import module这样的导入方式。使用import package这样的语句是不能使用包当中的任何模块的
➢__init__.py也是个模块,也可以在这个模块中导入其他模块,这样import package时,就能直接使用导入的内容了