什么叫做相对导入?

一句话!导入同一个包中的模块就叫做相对导入。例如你要导入其它包中的模块,那就不是相对导入,而是绝对导入。

如何用代码来实现相对导入呢?

很简单!在from导入语句中加一个点号就可以了。

from .import spam # Relative to this package

上面就是一个相对导入语句(注意看,import单词前面有一个点号)。代码意思就是从当前代码文件所在的包中导入一个名为spam的模块。注意!注意!注意!在Python 3.0版本后,它只搜索当前的包,如果当前包中没有名为spam的模块,导入就失败了。而在Python2.6中,会先执行相对导入,如果找不到,再继续执行绝对导入,也就是去其它地方继续找。如果没有那个小点号,那么就不是相对导入,那么就不会搜索当前包。

from .spam import name

上面代码的意思是,从当前包中找到一个名为spam的模块,然后导入里面名为name的变量。

为什么要使用相对导入?

一句话!解决导入时的模糊性。这一句话有同学可能理解不了,下面我用很多句话来帮你深入深入又深入滴理解!

假射有一个包,名为mypkg,里面有如下文件

mypkg\

   __init__.py

   main.py

   string.py

又假射,在模块main中用下面的代码来试图导入名为string的模块。

import string

问题来了?mypkg包中和Python标准库中都有名为string的模块。如果没有相对导入这么一个技术,那么我们将永远无法导入标准库里的string模块,因为上面的代码首先会找到当前包mypkg中的string。有了相对导入这么一个规定,上面的语句就不会搜索mypkg包,那么就会找到标准库里的string。

如果你想使用mypkg包中的string,那么就要显式滴使用下面的相对导入语法。

from .import string # Imports mypkg.string (relative)

这就是为什么要使用相对导入!

不知道我说明白了没有。欢迎大家留言,留下点回忆!