Python-包的使用

一、包是什么

当模块数目的增多,把所有模块不加区分地放到一起也是非常不合理的,Python为我们提供了一种把模块组织到一起的方法,即就是创建一个包。包就是一个含有__init__.py文件的文件夹,文件夹内可以组织子模块或者子包,

# 例如:
pool/                #顶级包
├── __init__.py     
├── futures          #子包
│   ├── __init__.py
│   ├── process.py
│   └── thread.py
└── versions.py      #子模块

要注意的地方

  1. 在python3中,即使包下没有__init__.py文件,import 导入包依然不会报错,但在python2中,包下一定要有该文件,否则import 导包会报错,

  2. 创建包的目的不是为了运行,而是被导入使用,包只是模块的一种形式而已,包的本质就是一种模块。

二、包的使用

导入包与__init__.py包属于模块的一种,因而包以及包内的模块均是用来被导入使用的,而绝非被直接执行,首次导入包(如import pool)同样会做三件事:

  1. 执行包下的__init__.py文件
  2. 产生一个新的名称空间用于存放__init__.py执行过程中产生的名字
  3. 在当前执行文件所在的名称空间中得到一个名字pool,该名字指向__init__.py的名称空间,例如http://pool.xxx和pool.yyy中的xxx和yyy都是来自于pool下的__init__.py,也就是说导入包时并不会导入包下所有的子模块与子包。

注意须知:
4. 关于包相关的导入语句也分为import和from … import …两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如import 顶级包.子包.子模块,但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。

  1. 包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间

  2. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件

绝对导入和相对导入

扫描二维码关注公众号,回复: 11714509 查看本文章

相对导入可以避免硬编码,对于包的维护是友好的。绝对导入可以避免与标准库命名的冲突,实际上也不推荐自定义模块与标准库命令相同。

绝对导入: 指明顶层 package 名。比如 import a,Python 会在 sys.path里寻找所有名为 a 的顶层模块。

import A.B 

或

from A import B

相对导入: 在不指明 package 名的情况下导入自己这个 package 的模块,表示只在 package 的内部目录中搜索,并且不会搜索位于 sys.path 上某处同名的模块,直接效果就是包模块覆盖了外部的模块。

from . import B 

# 或 

from ..A import B

.代表当前模块,…代表上层模块,…代表上上层模块,依次类推。

比如一个 package 下有 a.py 和 b.py 两个文件,在 a.py 里 from . import b 即是相对导入 b.py。

# a.py
from . import b

from 包 import *​

在使用包时同样支持from pool.futures import * ,毫无疑问 *代表的是futures下__init__.py中所有的名字,通用是用变量__all__来控制*代表的意思#futures下的__init__.py
__all__=['process','thread']

猜你喜欢

转载自blog.csdn.net/msmso/article/details/107671993