包:将解决一类问题的模块放在同一目录下就形成了一个包
为了更好的了解包,我们就模拟创建一个包
import os os.makedirs(‘glance/api‘) os.makedirs(‘glance/cmd‘) os.makedirs(‘glance/db‘) lis = [open(‘glance/__init__.py‘, ‘w‘), open(‘glance/api/__init__.py‘, ‘w‘), open(‘glance/api/policy.py‘, ‘w‘), open(‘glance/api/versions.py‘, ‘w‘), open(‘glance/cmd/__init__.py‘, ‘w‘), open(‘glance/cmd/manage.py‘, ‘w‘), open(‘glance/db/__init__.py‘, ‘w‘), open(‘glance/db/models.py‘, ‘w‘)] map(lambda f: f.close(), lis)
我们创建的那些‘.py‘文件就相当于一个个模块,可以在里面写一个简单的函数,用作测试。
包中模块的导入
# 通过包名.目录.模块名 将包内部的模块导入 import glance.api.policy as policy policy.get()
__init__.py文件的作用
# 每个包下面都要有一个__init__.py文件 导入包时,就会执行这个文件 f = open(‘glance/__init__.py‘, ‘w‘, encoding=‘utf-8‘) f.write("print(‘this is glance/__init__.py‘)") f.close() import glance # 打印this is glance/__init__.py
因此在我们自己创建一个包时,就可以利用__init__.py在完成内层的导入工作。
""" 因此可以通过在__init__.py文件提前写好包的下一层的导入代码 from glance import api from glance import cmd from glance import db """ f = open(‘glance/api/__init__.py‘, ‘w‘, encoding=‘utf-8‘) f.write("print(‘this is glance/api/__init__.py‘)") f.close() # 执行了from glance import api 进而执行了api下的__init__.py import glance # 打印this is glance/api/__init__.py # 在api下的__init__.py写好 from glance.api import policy import glance glance.api.policy.get() # 打印from policy.py """ 通过这种提前在__init__.py文件中写好下一层所有内容的导入代码的方式 只需要import包名就可以导入下面的所有模块 """
一般有两种导入方式:绝对路径导入和相对路径导入
1,绝对路径导入
# 绝对路径导入 在__init__.py文件中写导入代码时,使用绝对路径,如:from glance.api import policy """ 优点:导入后,不管在包内部还是外部都可以使用,并且直观。 缺点:不能挪动,不然就会找不对路径 """
2,相对路径导入
# 相对路径导入 在__init__.py文件中写导入代码时,使用相对路径,如:from . import policy """ ‘.‘代表当前目录 优点:可以随意挪动,只要能找包,里面的模块就能正常导入 缺点:不能在包内使用包中的其他模块,执行导入会报错 """