模块与包
在前面我们已经学习了函数与类,但是都写在一个文件里面。如果想要被另外一个文件调用,那就需要使用模块与包。
模块
一个 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__.py
和 api.py
在同一目录下,因此在 __init__.py
文件中想要导入 api.py
文件,可以使用相对路径,也就是使用linux系统中的 .
(本目录) 和..
(上级目录),并且只能在一个目录中使用,不能用于不同目录内。