【每天1分钟】PYTHON基础之模块(包)
示范文件
$\glance
$\glance\__init__.py
$\glance\api
$\glance\api\__init__.py
$\glance\api\policy.py
$\glance\api\versions.py
$\glance\cmd
$\glance\cmd\__init__.py
$\glance\cmd\manage.py
$\glance\db
$\glance\db\__init__.py
$\glance\db\models.py
0. 包的导入操作
-
import package_name
-直接导入一个包,可以直接使用__init__.py的内容1.1 使用方式:
package_name.func_name
package_name.class_name.func_name()
1.2 此种访问的内容是:
案例:pkg01,p07.py -
import package name as p
2.1 具体用法跟作用方法,跟上面一致
2.2 注意的是此方法默认是对 init.py的内容进行导入 -
import package.module
3.1 导入某一个具体的模块
3.2 使用方法:
package.module.func_name
- from … import 导入
from package import module,module2…
此种方法不导入 'init’的内容 - from package import *
导入指定包的所有内容
1. 包的使用之import
D:\tmp临时文件>python test.py # 与 glance 文件夹同级
from models.py: mysql
单独导入包名称时不会导入包中所有包含的所有子模块,如
#在与glance同级的test1.py中
import glance
glance.cmd.manage.main()
执行结果:
AttributeError: module 'glance' has no attribute 'cmd'
解决方法:
#glance/__init__.py
from . import cmd
#glance/cmd/__init__.py
from . import manage
再执行:
D:\tmp临时文件>python test1.py
from manage.py
2. 包的使用之from … import …
需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法
***3. from glance.api import ****
此处是想从包api中导入所有,实际上该语句只会导入包api下__init__.py文件中定义的名字,我们可以在这个文件中定义__all___:
#在__init__.py中定义
x=10
def func():
print('from api.__init.py')
__all__=['x','func','policy']
此时我们在于glance同级的文件中执行from glance.api import *就导入__all__中的内容(versions仍然不能导入)。
4. 绝对导入和相对导入
我们的最顶级包glance是写给别人用的,然后在glance包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式:
绝对导入:以glance作为起始
相对导入:用.或者…的方式最为起始(只能在一个包中使用,不能用于不同目录内)
例如:我们在glance/api/version.py中想要导入glance/cmd/manage.py
在glance/api/version.py
#绝对导入
from glance.cmd import manage
manage.main()
#相对导入
from …cmd import manage
manage.main()
测试结果:注意一定要在于glance同级的文件中测试
5. 包以及包所包含的模块都是用来被导入的,而不是被直接执行的。而环境变量都是以执行文件为准的
比如我们想在glance/api/versions.py中导入glance/api/policy.py,这俩模块是在同一个目录下,如果直接这么做
from glance.api import versions
'''
执行结果:
ImportError: No module named 'policy'
'''
'''
分析:
此时我们导入versions在versions.py中执行
import policy需要找从sys.path也就是从当前目录找policy.py,
这必然是找不到的
'''
6. 绝对导入与相对导入总结
绝对导入: 以执行文件的sys.path为起始点开始导入,称之为绝对导入
优点: 执行文件与被导入的模块中都可以使用
缺点: 所有导入都是以sys.path为起始点,导入麻烦
相对导入: 参照当前所在文件的文件夹为起始开始查找,称之为相对导入
符号: .代表当前所在文件的文件加,…代表上一级文件夹,…代表上一级的上一级文件夹
优点: 导入更加简单
缺点: 只能在导入包中的模块时才能使用
注意:
- 相对导入只能用于包内部模块之间的相互导入,导入者与被导入者都必须存在于一个包内
- attempted relative import beyond top-level package # 试图在顶级包之外使用相对导入是错误的,言外之意,必须在顶级包内使用相对导入,每增加一个.代表跳到上一级文件夹,而上一级不应该超出顶级包