包
包
我们知道python中常用的模块比如re,sys,os等等之类,我们只需要在用的时候去调用就行。并且知道那些模块本质上就是.py文件。
在python中,我们很多时候需要的功能python自带的模块已经不能满足,但又时常需要。这是我们会将我们事先写好的都东西进行打包。方便调用。
包是一种通过使用‘.模块名’来组织python模块名称空间的方式。
1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法
2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)
3. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件
强调:
1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错
2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包即模块
并且包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间。
形象的点的比喻就是,有两个不同的家庭,两个家庭中的都有一个叫做小明的孩子。虽然名字一样,但是我们知道这是两个不同的人。
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)
#文件内容 #policy.py def get(): print('from policy.py') #versions.py def create_resource(conf): print('from version.py: ',conf) #manage.py def main(): print('from manage.py') #models.py def register_models(engine): print('from models.py: ',engine) 文件内容
我们通过创建一个包来看下具体是怎么实现的。
运行,并在子.py文件中输入我们的代码。
注意我们中"__init__.py"这个文件,这个是我们包连接起来的关键。
我们可以看到,在每个文件夹之中都有一个这个文件。当我们在其他py文件调用这个包时,会首先执行这个文件里面的内容。
这时,我们只需要在“__init__.py"文件中写入本根路径下的调用路径,依次内推。就可以实现如re,os这种调用了。
如:
1 import glance.db.models 2 glance.db.models.register_models('mysql')