包
包:包是通过使用‘.模块名’来组织python模块名称空间的方式。具体来讲,包就是一个包含__init__.py
(前后都是双下划线)文件的文件夹。
- 目的:用文件夹将文件/模块组织起来。
注意:
1.python3中,即是包中没有__init__.py
也可使用
2.而在python2中,如果没有__init__.py
,肯定报错
创建包的目的不是为了运行,而是为了被导入使用。
包的本质依然是模块。
- 使用时,import导入,导入带点的模块时,点的左边一定是包名。
- import导入文件时,产生名称空间的名字源于文件,import 包,名称空间同样源于文件(包),
__init__.py
,导入包的本质就是导入它。
demo:
在这个项目文件夹内新建了一个school文件夹,也就是一个包[外链图片转存失败(img-LD1mEtbM-1564322264364)(C:\Users\ou\Desktop\1564320149935.png)]
def register_models(engine):
print('from models.py',engine)
def main():
print('from mamnage.py')
test.py(test是与school文件夹同级的文件)
import school.db.models
school.db.models.register_models('MysSQL')
#from models.py MysSQL
import school
school.cmd.manage.main()
# AttributeError: module 'school' has no attribute 'cmd'
from school.cmd.manage import main
main()
#from mamnage.py
单独导入包时,不会导入该包中所包含包的所有子模块,但有时候我们就是想导入该包,使其能运行其包含的子模块
对school文件夹里的__init__.py
进行修改
from . import cmd
对school文件夹下的cmd文件夹里的__init__.py
进行修改
from . import manage (from.表示被调用)
import school
school.cmd.manage.main()
#from mamnage.py
可以看到,进行如上操作后,只导入school,也能调用cmd里的manage文件。
也可以使用如下操作
对cmd进行操作:
__all__=['manage']
from school.cmd import *
manage.main()
#from mamnage.py
__all__
=[模块1,模块2,…,模块n]
在school下的api文件夹下调用cmd文件夹下的manage文件
from ..cmd import manage #用相对路径调用
manage.main()
在school下的api文件夹下调用cmd文件夹下的manage文件
from ..cmd import manage #用相对路径调用
manage.main()
`
在school下的api文件夹下调用cmd文件夹下的manage文件
from ..cmd import manage #用相对路径调用
manage.main()