【每天1分钟】PYTHON基础之模块(包)

【每天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. 包的导入操作

  1. import package_name
    -直接导入一个包,可以直接使用__init__.py的内容

    1.1 使用方式:
    package_name.func_name
    package_name.class_name.func_name()
    1.2 此种访问的内容是:
    案例:pkg01,p07.py

  2. import package name as p
    2.1 具体用法跟作用方法,跟上面一致
    2.2 注意的是此方法默认是对 init.py的内容进行导入

  3. import package.module
    3.1 导入某一个具体的模块
    3.2 使用方法:

package.module.func_name

  1. from … import 导入
    from package import module,module2…
    此种方法不导入 'init’的内容
  2. 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为起始点,导入麻烦

相对导入: 参照当前所在文件的文件夹为起始开始查找,称之为相对导入
符号: .代表当前所在文件的文件加,…代表上一级文件夹,…代表上一级的上一级文件夹
优点: 导入更加简单
缺点: 只能在导入包中的模块时才能使用
注意:

  1. 相对导入只能用于包内部模块之间的相互导入,导入者与被导入者都必须存在于一个包内
  2. attempted relative import beyond top-level package # 试图在顶级包之外使用相对导入是错误的,言外之意,必须在顶级包内使用相对导入,每增加一个.代表跳到上一级文件夹,而上一级不应该超出顶级包
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值