1、简单情形
Python中的包、模块导入主要有两种方式:
() import package.module
() from package import module
将模块导入当前程序之后,模块module中对应的属性attr使用方式分别是:
() package.module.attr
() module.attr
由此可以总结模块中的成员引用规律:
- import导入的包,使用包中具体成员时要使用‘绝对路径’ ,从顶级包名开始写成员引用路径;
- from—import导入的包,使用包中具体成员时使用‘相对路径’,从from—import 结构中的import之后的模块开始写成员引用路径;
2、复杂情形
当包中包含子包时,并考虑到
__init__.py
文件作用时,包、模块的导入及成员的使用较为复杂,容易造成混淆,例如,Python编程时有如下包结构:
pkg/
__init__.py
subPkg_a/
__init__.py
mod_a.py
mod_a1.py
mod_a2.py
subPkg_b/
__init__.py
mod_b.py
__init__.py
文件解释:
- 每个包下都有
文件,这是个包初始化模块,导入包时实质上是导入该文件中所定义的模块,也可以在该文件中做一些初始化工作,也可以是空文件。__init__.py
根据上述包结构,若在
mod_b.py
中要使用mod_a、mod_a1中的函数(注意各种导入方式中,函数的引用方式是不同的),有以下几种方法:
- 在
文件中写mod_b.py
、import pkg.subPkg_a.mod_a
或者import pkg.subPkg_a.mod_a1
、from pkg.subPkg_a import mod_a
from pkg.subPkg_a import mod_a1
- 在subPkg_a对应的
文件中写__init__.py
、import pkg.subPkg_a.mod_a
,那么在mod_b.py文件中导入时就可以使用import pkg.subPkg_a.mod_a1
或者import pkg.subPkg_a
方式导入mod_a及mod_b了,如下图所示.from pkg.subPkg_a import *
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TUtJGcS5mYwZFWjZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zM3YDMyYTN3ETOyATM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
当一个包中包含多个模块时,在
__init__.py
中还可以使用
__all__
变量存储一个导入模块列表,表达更为简洁,如下图所示。
注意:因为
__all__
变量列表中没有包含
mod_a2
,此时在
mod_b
中不能使用
mod_a2
中的成员。