Skip to content

模块与包

在前面我们已经学习了函数与类,但是都写在一个文件里面。如果想要被另外一个文件调用,那就需要使用模块与包。

模块

一个 py 文件,就是一个模块,文件中包括定义的函数和类等信息。

尽管可以 import 多次,实际上模块只导入一次

模块搜索路径内存中已经加载的模块 -> 内置模块 -> sys.path 路径(导模块的环境变量)中包含的模块

导入模块

导入模块有好几种方式

1、导入整个模块

python
import 模块名

2、从模块中导入内容

python
from 模块名称 import 变量1, 变量2

...  # 变量同时可以是函数、类

3、导入模块的所有函数

python
from 模块名 import *

* 是通配符,指代所以内容。第三种方式非常不推荐使用。

使用区别

  • import 模块名 调用模块的变量名(函数名、类名)时的格式是 模块.变量名
  • from 模块名 import 函数名 调用时格式是 函数名
  • form 模块名 import * 调用时格式是 函数名

当一个目录内含有 __init__.py 文件时,就可以视该目录为一个包,一个包由多个文件构成。

__init__.py 文件

该文件,可以表示该目录是一个包,内容可以为空,第一次导入包或者是包的任何其他部分,实际就是导入该文件。

因此,我们在该文件中导入需要的模块(别人在导入包的同时,也就导入 __init__.py 文件中的模块) ,这样在使用时,用户感觉可以将这个包当作模块使用,而不关心其背部结构。

例如:requests 包中的 __init__.py 主要文件内容如下:

python
from . import utils
from . import packages
from .models import Request, Response, PreparedRequest
from .api import request, get, head, post, patch, put, delete, options
from .sessions import session, Session
from .status_codes import codes
from .exceptions import (
    RequestException, Timeout, URLRequired,
    TooManyRedirects, HTTPError, ConnectionError,
    FileModeWarning, ConnectTimeout, ReadTimeout
)

其他模块在导入时,就可以简单的使用,不用关心其内部结构(使得导入包 向导入模块一样简单)

导入包

  • 导入包名

    python
    # import 包名
    import requests
  • 从包里面导入方法

    python
    # from 包名 import 方法/对象
    from requests import get
  • 从包的文件里面导入对象

    python
    # from 包名.文件名 import 方法/对象
    from requests.api import get

提示

包是模块的另一种形式,可以把包当初模块使用。

相对路径导入

requests 目录结构中,__init__.pyapi.py 在同一目录下,因此在 __init__.py 文件中想要导入 api.py 文件,可以使用相对路径,也就是使用linux系统中的 .(本目录) 和..(上级目录),并且只能在一个目录中使用,不能用于不同目录内。