包的概念和结构
当一个项目有多个模块时,需要再进行组织。我们将功能类似的模块放到一起,形成了‘包’。‘包’本质上就是必须有__init_
_.py的文件夹。
包下面可以包含‘模块(module)’,也可以包含‘子包(subpackage)’。就像文件夹下面可以有文件,也可以有子文件夹
一样。
pycharm中创建包
在pycharm开发环境中创建包,非常简单。在要创建包的地方单击右键:NEW--》python package即可,pycharm会自
动帮助我们生成带有__init__.py文件的包。
导入包操作和本质
例a\aa\module_AA.py
·import a.aa.module_AA
在使用时,必须加完整的名称来引用
·from a.aa import module AA
在使用时,直接可以使用模块名
·from a.aa.module_AA import fun_AA
在使用时,直接可以使用函数名
注:
·from package import item 这种语法中,item可以是包,模块,也可以是函数,类,变量
·import item1.item2 这种语法中,item必须是包或者模块,不能是其他。
导入包的本质其实是导入包的__init__.py文件。也就是说,‘import pack1’意味着执行了包pack1下面的__init__.py文件,
这样可以在__init__.py文件中批量导入我们需要的模块,而不再需要一个个导入。
__init__.py的三个核心作用:
·作为包的标识,不能删除。
·用来实现模糊导入。
·导入包实质是执行__init__.py文件,可以在__init__.py文件中做这个包的初始化、以及需要统一执行代码,以及批量
导入。
用*导入包
import*这样的语句理论上是希望文件系统找出包中所有的子模块,然后导入它们。这可能会花长时间等。python解决
方案是提供一个明确的包索引。
这个索引由__init__.py定义,__all__变量,该变量为一个列表,如上例a包下的__init__.py中,可定义__all__=['module_A
', 'module_A2']
这意味着,from sound.effects import * 会从对应的包中导入以上连个子模块;
【注】尽管提供import * 的方法, 仍不建议在生产中使用这种写法