你真的懂 Python import 吗

转载请注明出处❤️

作者:测试蔡坨坨

原文链接:caituotuo.top/9ecaf43a.html


你好,我是测试蔡坨坨。

众所周知,Python中的import语句是用来调用模块的,在Python项目中几乎都会用到import。

今天,我们就来聊一聊python import,关于import你需要知道的一切,看完这篇就足够了。

module和package

在聊import之前,我们需要理清两个概念,也就是module和package。

module

官方文档对于module的解释说明:

文档地址:https://docs.python.org/3.7/glossary.html#term-module

An object that serves as an organizational unit of Python code. Modules have a namespace containing arbitrary Python objects. Modules are loaded into Python by the process of importing.

我们可以知道,在Python中,module算是一个组织单位,它自己独立构成一个命名空间,本身是一个Python Object,在Python Object中还可以有许多其他的Python Object。

在实际应用中,一个module通常对应一个XX.py文件,但是这并不是绝对的,你也可以从其他类型的文件里面生成一个module,只是我们最常见的文件是一个.py文件。

module是一个Python运行时的概念,本身是一个Python Object,保存在内存里是Python级别的概念,而文件是一个操作系统级别的概念,因此我们需要通过import导入这个过程,从一个文件里生成一个module。

package

官方文档对于package的解释说明:

文档地址:https://docs.python.org/3.7/glossary.html#term-package

A Python module which can contain submodules or recursively, subpackages. Technically, a package is a Python module with an __path__ attribute.

首先,我们可以知道package就是一种特殊的module,在Python中,package几乎跟module有一模一样的功能,它只是多了一个__path__

我们之所以要区分module和package,是因为在操作系统层级,package往往对应的是一个文件夹,一个文件夹里面可以有文件夹和文件,但是一个文件里面不能有文件夹。所以一个package里面可以有其他的subpackage,也可以有module,但是module在组织结构上就是最末端的东西。

有一种说法是,文件夹里面有__init__这个文件,它才有可能成为一个package。其实这种说法在Python3中是错误的,无论有没有__init__文件,一个文件夹都可以作为package使用。

import

在解释完module和package之后,我们正式进入import的讲解。

import是把文件系统里面的文件或者文件夹变成Python的module或者package的过程。

比如以下举栗,在当前文件夹内有两个.py文件,一个是caituotuo.py,另一个是caituotuo_test.py:

在caituotuo_test.py里面可以使用import caituotuo,把caituotuo.py里面写的内容变成一个module:

当我们在import caituotuo的时候,发生了如下这些事儿:

  • 首先,它会拿到caituotuo这个字符串,把它作为名字来寻找module
  • 接下来,它会检查缓存中有没有一个叫caituotuo的module已经被读取进来了,如果有,则到这里就结束了,不需要下面的过程,可以直接把它赋值给caituotuo
  • 如果没有,就要寻找这个名字叫做caituotuo的module,在寻找的过程中,首先回去看这个名字是不是一个builtin module(Python内置模块,比如sys、os、time、math等),如果不是内置模块,