python 包
一、包
1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法
2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)
3. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件
强调:
1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错
2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包即模块
注意事项:
1.关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。
2.对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。
3.对比import item 和from item import name的应用场景:
如果我们想直接使用name那必须使用后者。
1.import
1 import glance.db.models 2 glance.db.models.register_models('mysql')
2.from...import...
需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法
3.__init__.py文件:
不管是哪种方式,只要是第一次导入包或者是包的任何其他部分,都会依次执行包下的__init__.py文件(我们可以在每个包的文件内都打印一行内容来验证一下),这个文件可以为空,但是也可以存放一些初始化包的代码。
4.from glance .api import *
在讲模块时,我们已经讨论过了从一个模块内导入所有*,此处我们研究从一个包导入所有*。
此处是想从包api中导入所有,实际上该语句只会导入包api下__init__.py文件中定义的名字,我们可以在这个文件中定义__all___:
5.绝对路径导入和相对路径导入
绝对路径:以glance作为起始
相对路径:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内)
相对路径只能在包中用(带上.或者..的在该模块下执行是报错的)
1 在glance/api/version.py 2 3 #绝对导入 4 from glance.cmd import manage 5 manage.main() 6 7 #相对导入 8 from ..cmd import manage 9 manage.main()
包的进阶
1.包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间
2.常见目录结构
1 import os 2 os.makedirs('glance/api') 3 os.makedirs('glance/cmd') 4 os.makedirs('glance/db') 5 l = [] 6 l.append(open('glance/__init__.py','w')) 7 l.append(open('glance/api/__init__.py','w')) 8 l.append(open('glance/api/policy.py','w')) 9 l.append(open('glance/api/versions.py','w')) 10 l.append(open('glance/cmd/__init__.py','w')) 11 l.append(open('glance/cmd/manage.py','w')) 12 l.append(open('glance/db/models.py','w')) 13 map(lambda f:f.close() ,l) 14 15 创建目录代码
3.目录结构
1 glance/ #Top-level package 2 3 ├── __init__.py #Initialize the glance package 4 5 ├── api #Subpackage for api 6 7 │ ├── __init__.py 8 9 │ ├── policy.py 10 11 │ └── versions.py 12 13 ├── cmd #Subpackage for cmd 14 15 │ ├── __init__.py 16 17 │ └── manage.py 18 19 └── db #Subpackage for db 20 21 ├── __init__.py 22 23 └── models.py 24 25 目录结构 26 27 目录结构
4.文件内容
1 print('from models.py: ',engine)
5.软件开发规范

6.绝对导入
1 glance/ 2 3 ├── __init__.py from glance import api 4 from glance import cmd 5 from glance import db 6 7 ├── api 8 9 │ ├── __init__.py from glance.api import policy 10 from glance.api import versions 11 12 │ ├── policy.py 13 14 │ └── versions.py 15 16 ├── cmd from glance.cmd import manage 17 18 │ ├── __init__.py 19 20 │ └── manage.py 21 22 └── db from glance.db import models 23 24 ├── __init__.py 25 26 └── models.py 27 28 绝对导入 29 30 绝对导入
7.相对导入
1 glance/ 2 3 ├── __init__.py from . import api #.表示当前目录 4 from . import cmd 5 from . import db 6 7 ├── api 8 9 │ ├── __init__.py from . import policy 10 from . import versions 11 12 │ ├── policy.py 13 14 │ └── versions.py 15 16 ├── cmd from . import manage 17 18 │ ├── __init__.py 19 20 │ └── manage.py from ..api import policy 21 #..表示上一级目录,想再manage中使用policy中的方法就需要回到上一级glance目录往下找api包,从api导入policy 22 23 └── db from . import models 24 25 ├── __init__.py 26 27 └── models.py 28 29 相对导入 30 31 相对导入
8.import glance 之后直接调用模块中的方法
1 glance/ 2 3 ├── __init__.py from .api import * 4 from .cmd import * 5 from .db import * 6 ├── api 7 8 │ ├── __init__.py __all__ = ['policy','versions'] 9 10 │ ├── policy.py 11 12 │ └── versions.py 13 14 ├── cmd __all__ = ['manage'] 15 16 │ ├── __init__.py 17 18 │ └── manage.py 19 20 └── db __all__ = ['models'] 21 22 ├── __init__.py 23 24 └── models.py 25 26 27 import glance 28 policy.get() 29 30 import glance
更多知识及详情见:http://www.cnblogs.com/Eva-J/articles/7292109.html

浙公网安备 33010602011771号