你真的懂 Python import 吗
你真的懂 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等),如果不是内置模块,