生成包
我们通过代码生成系列包
#什么是包:一群模块文件的集合+__init__
#py2 : 必须有__init__
#py3:不是必须的了
import os
os.makedirs('glance/api')
os.makedirs('glance/cmd')
os.makedirs('glance/db')
l = []
l.append(open('glance/__init__.py','w'))
l.append(open('glance/api/__init__.py','w'))
l.append(open('glance/api/policy.py','w'))
l.append(open('glance/api/versions.py','w'))
l.append(open('glance/cmd/__init__.py','w'))
l.append(open('glance/cmd/manage.py','w'))
l.append(open('glance/db/models.py','w'))
map(lambda f:f.close() ,l)
看下项目列表结构
导入包下的模块、以及包下_init_初始化模块
关于包相关的导入语句也分为import和from … import …两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。
我们在生成api包下的policy.py里面写入一段代码如下:
print("policy")
我们在生成api包下的init.py里面写入一段代码如下:
print("api init")
然后导入api包下的policy.py的模块
from glance.api import policy,versions
# from glance import api.policy(这样写法错误的)
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/4.包.py
api init
policy
Process finished with exit code 0
不管是哪种方式,只要是第一次导入包或者是包的任何其他部分,都会依次执行包下的init.py文件(我们可以在每个包的文件内都打印一行内容来验证一下),这个文件可以为空,但是也可以存放一些初始化包的代码。
_init_下的_all__方法
init.py
print("api init")
x=10
def func():
print('from api.__init.py')
__all__=['x','func','policy']
policy.py
print("policy")
versions.py
print("--version--")
然们导入上面的包下的模块
from glance.api import *
print(x)
func()
输出如下:
E:\python\python_sdk\python.exe E:/python/py_pro/4.包.py
api init
policy
10
from api.__init.py
Process finished with exit code 0
我们看到在versions.py中的print(“–version–”)么有输出,因为all=[‘x’,’func’,’policy’]没有包含在内,故不能导入该模块