控制from xxx import *导入的成员

默认情况下,所有的成员都会被导入。但可以修改__all__变量控制哪些成员可以被导入。该变量是字符串列表(或元组),内部元素是可被导入的成员名。

示例请看下图:test1模块中有name、age、height三个成员,__all__变量保存了这三个成员名。test2模块用from test1 import *导入test1所有成员,此时test2模块可以正常使用test1的三个成员。




python代码模块结构 python 模块的所有方法_java


再看下图:test1模块中__all__变量保存了三个成员名,但注释了height这个成员(注意列表的书写方式,一个元素一行,用ctrl+/注释不能被导入的成员非常方便。如果所有内容写在一行时就不能注释内部元素,只能删除),test2模块用from test1 import *导入test1的所有成员,此时只能使用name和age这两个成员,height成员不能使用。


python代码模块结构 python 模块的所有方法_python代码模块结构_02


注意:使用import 模块时,__all__不起作用。请看下图示例,test2模块用import test1导入test1的所有成员后,即使test1的height成员在__all__变量中被注释了,仍然可以正常使用。


python代码模块结构 python 模块的所有方法_编程语言_03


绝对导入

在大型项目中经常会遇到模块文件很多的情况,为了方便管理一般会按功能分别建立多个文件夹,在不同文件夹下各自有多个模块,各个模块之间还存在相互引用的情况。今天先梳理一种绝对导入的方法。

有一个项目,路径是D:\Python自学笔记\模块,在该项目下有多个模块和文件夹,其中aa文件夹下有b文件夹,b文件夹内有bb.py模块。

注意红圈的内容,实际上python解释器会在加载.py文件时自动生成sys.path列表信息,sys.path[0]是当前模块的完整路径,sys.path[1]是当前模块的项目路径。

现bb模块需要调用cc模块的成员num2,可以通过from aa.c.cc import *的方法,其中b模块已知项目路径是“D:\Python自学笔记\模块”,然后加上aa文件夹名再加上.c文件夹名再加.cc模块名,即可绝对导入cc.py模块中所有的成员。


python代码模块结构 python 模块的所有方法_java_04


python代码模块结构 python 模块的所有方法_python_05


在项目路径“D:\Python自学笔记\模块”下有test_import.py模块,可以通过绝对导入的方式导入bb模块(另外bb模块中已经绝对导入cc模块,所以相当于同时导入了bb和cc),还可以通过import导入同路径下的test1模块。


python代码模块结构 python 模块的所有方法_js_06


python代码模块结构 python 模块的所有方法_js_07


绝对路径导入方法简洁易懂,要参与大型项目必须得学会这项技能。深入学python的朋友们最好自行敲代码多多练习加以熟练掌握。