我们知道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)
View Code
#文件内容

#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)

文件内容
View Code

我们通过创建一个包来看下具体是怎么实现的。

运行,并在子.py文件中输入我们的代码。

注意我们中"__init__.py"这个文件,这个是我们包连接起来的关键。

我们可以看到,在每个文件夹之中都有一个这个文件。当我们在其他py文件调用这个包时,会首先执行这个文件里面的内容。

这时,我们只需要在“__init__.py"文件中写入本根路径下的调用路径,依次内推。就可以实现如re,os这种调用了。

如:

1 import glance.db.models
2 glance.db.models.register_models('mysql') 
View Code

 

posted @ 2019-09-08 20:34  套你大象  阅读(131)  评论(0编辑  收藏  举报