1. 包的概念
把解决一类问题的模块放在同一个文件夹里 —— 包
2. 自行创建一个包
范例:
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/__init__.py','w'))
l.append(open('glance/db/models.py','w'))
map(lambda f:f.close() ,l)
执行结果:
生成一个glance目录
glance目录结构:
glance/ #Top-level package
├── __init__.py #Initialize the glance package
├── api #Subpackage for api
│ ├── __init__.py
│ ├── policy.py
│ └── versions.py
├── cmd #Subpackage for cmd
│ ├── __init__.py
│ └── manage.py
└── db #Subpackage for db
├── __init__.py
└── models.py
文件内容:
#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)
3. 注意事项
1.关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包
,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。
范例1:
import glance.api.policy as policy
policy.get()
执行结果:
from policy.py
范例2:
from glance.api import policy
policy.get()
执行结果:
from policy.py
需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法
2.对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。
3.对比import item 和from item import name的应用场景:
如果我们想直接使用name那必须使用后者。
4. _init_
演示执行包下面的所有方法
范例1:绝对路径
编辑文件:
# glance/__init__.py
from glance import api
from glance import cmd
from glance import db
# glance/api/__init__.py
from glance.api import policy
from glance.api import versions
# glance/cmd/__init__.py
from glance.cmd import manage
# glance/db/__init__.py
from glance.db import models
import glance
glance.api.policy.get()
glance.db.models.register_models("mysql")
执行结果:
from policy.py
from models.py: mysql
范例2.1:相对路径
前提先将整个glance包移动至dir目录下
编辑文件
# glance/__init__.py
from . import api
from . import cmd
from . import db
# glance/api/__init__.py
from . import policy
from . import versions
# glance/cmd/__init__.py
from . import manage
# glance/db/__init__.py
from . import models
from dir import glance
glance.api.policy.get()
执行结果:
from policy.py
范例2.2:相对路径_all_
_all_是用于控制from...import *
glance/
├── __init__.py from .api import *
from .cmd import *
from .db import *
├── api
│ ├── __init__.py __all__ = ['policy','versions']
│ ├── policy.py
│ └── versions.py
├── cmd __all__ = ['manage']
│ ├── __init__.py
│ └── manage.py
└── db __all__ = ['models']
├── __init__.py
└── models.py
import glance
policy.get()
4.1 绝对路径与相对路径的区别
绝对路径:
使用绝对路径 不管在包内部还是外部 导入了就能用
不能挪动,但是直观
相对路径:
可以随意移动包 只要能找到包的位置,就可以使用包里的模块
包里的模块如果想使用其它模块的内容只能使用相对路径,使用了相对路径就不能在包内直接执行了