基于前面的模块的学习,提出一种可能性:大多数情况下我们除了必要,不太可能完全知道所有模块名,这个时候,如果刚好自己定义的模块名和别人的冲突了,那还是可能引起很多麻烦,,,所以这个时候,包就可以出现了。
-
包de组成
Python中的包,是由一个__init__.py文件和很多子包组成的:
__init__.py这个东西,用来标识一个文件夹是包,注意在使用包的过程中别删除这个文件,因为没有__init__.py这个货,解析器会认为这就是个普通的文件夹了。
子包,自然表示一个包下面还可以有不止一个包,是允许层层嵌套的。
栗如:
一个模块名叫 bo1.py,在包aBo和bBo下都存在。但是这俩包不相同,所以模块使用也不会冲突,因为不同包名下,访问时是不可能模块名相同的——
aBO包下的模块名变成aBO.bo1
bBO下的模块名变成了aBO.bo1
访问包的方式如图:
子包下的模块名,和函数一样,层层嵌套:
mainPak.subLevel1.subLevel2.module
-
__init__.py文件
既然说__init__.py是包的标志,那么这个文件是哪里来的呢?
首先,有了__init__.py,一个文件夹就是包;而在创建Python的project的时候,自动生成的也是一个文件夹。对比思考后——__init__.py这个文件,是需要自己生成的。
如何生成__init__.py文件:
说明:只要创建一个这个文件,无论文件内容是空白的还是有相应内容的,都可以把一个文件夹贴上包的标签,也不会影响包的使用。
一般来说,很多人会选择让__init__.py文件为空,因为它的作用只是表示包,但有时候我们也可以直接把它当做一个普通的python脚本,实现自己需要的内容。
e1: 导入所有所需模块
(1)Import导入所需模块
在导入一个包的时候,实际是导入它的__init__.py文件,既然这样,那直接在导入包的时候,import所需要的模块就好啦,这样在用到模块的时候,就不用再一个一个import了。
例如:
import a
import b
import c
(2)__all__变量
这个变量是个列表,导入模块的时候,可以把所有模块放到这个list里,导入:
__all__ = [‘module1’, ‘module2’, ‘module3’, ‘module4’]
from packageName import *
直接在__init__.py中import模块或者包,就相当注册过了,后面我发现已经注册了,那就把里面这些包或者模块拿过来放在当前文件夹下面就好啦。
e2:建立自己的类或者函数
在__init__.py里面建立了类或者函数的时候,和其他.py文件一样,是可以正常引用的。