跳转至

模块和包

模块和包的命令都应遵循python变量的命名规则。

一、模块

本质就是一个.py文件,封装语句的最小单位,是一系列功能的集合体。使用模块可以提高开发效率,便于维护和管理。

1. 模块的分类

  1. 内置模块

  2. 第三方模块、扩展模块

  3. 自定义模块

2. 模块的形式

  1. 使用python编写的源代码文件(.py文件)
  2. 字节码文件(.pyc)
  3. 用C或C++编写的编译扩展模块,导入时使用动态链接(linux的.so、Cygwin或Windows的.dll)
  4. 把一系列模块组织到一起的文件夹(包)
  5. 使用C编写并链接到python解释器的内置模块
  6. zip文件,导入时自动解压缩

3. 模块的搜索路径

  1. 程序主目录
  2. PYTHONPATH目录
  3. 标准库目录
  4. .pth文件中的内容(不常用)
  5. 第三方扩展应用的site-packages主目录
1
2
3
4
5
6
7
$ python3
Python 3.6.9 (default, Oct  8 2020, 12:12:24) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/home/gp/.local/lib/python3.6/site-packages', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']

4. 模块的运行方式

  1. 脚本方式:直接用解释器执行
  2. 模块方式:被其他的模块导入执行,为导入它的模块提供资源(变量、函数定义、类定义等)。

自定义模块被其他模块导入时,其中的可执行语句会立即执行。

5. 模块的导入

5.1 导入模块的规范

1
2
3
4
5
#/usr/bin/env python3
import python内置模块
import 第三方模块
import 自定义模块
...

5.2 导入模块时发生了什么

5.2.1 导入的三个步骤

程序第一次导入指定文件时,会执行三个步骤:

  1. 找到模块文件
  2. 编译成字节码
  3. 执行模块的代码来创建其所定义的对象

之后再导入相同的模块时会跳过这三个步骤,而只是提取内存中已加载的模块对象,python会把已加载的模块存储到sys.modules字典中。

5.2.2 导入模块时执行的三件事
  1. 在内存中创建以模块名称命名的名称空间
  2. 从头到尾依次执行该模块文件内的语句,文件顶层的(不在def或class之内)赋值名称的语句(=或def)会创建模块对象的属性,赋值的名称会存储在模块的命名空间内。
  3. 通过模块.的方式调用此模块中的内容

5.3 导入模块的方式

5.3.1 import

语法格式

1
2
import module # 导入一个模块的所有成员
import module1, module2 # 一次性导入多个模块,不推荐这种写法

import会整体读取一个模块,使用名称时需要加上模块名。

1
2
>>> import time
>>> time.sleep(1)
5.3.2 from

语法格式

1
2
3
from module import name
from module import name1, name2 # 某个模块中导入多个成员
from module import * # 导入一个模块的所有成员,在python3中只能用在一个模块文件的顶部,不能用在函数中

from从模块中读取特定的名称,使用时不需要加模块名。

1
2
>>> from time import sleep
>>> sleep(1)

使用别名alias

  • 给成员取别名,避免名称冲突from xxx import zzz as y
  • 给模块取别名,简化熟悉import xxx as y
使用__all__控制被导入的成员

from xxx import *控制成员被导入,__all__是一个列表,用于表示本模块可以被外界使用的成员,元素是成员的字符串。

1
2
# 只有使用`from xxx import *`导入才有效
__all__ = ["成员1", "成员2"]

6. __name__属性

每个模块内有一个名为__name__的内置属性。

  1. 如果文件作为顶层程序文件(脚本方式)执行时,__name__ 值为字符串__main__

  2. 如果文件被当做模块导入时,__name__的值为就是本模块的名字。

二、模块包

包就是一个包含有__init__.py文件的文件夹

1. 导入包的方式

1
2
import
from ... import ...