【Python】模块导入 ⑥ ( `__all__` 变量简介 | `__all__` 变量用法 | import 导入整个模块 - 执行阶段报错 | from 导入整个模块 - 编译阶段报错 )
文章目录
一、__all__ 变量简介
1、__all__ 变量
Python 语言中的 __all__ 变量 是一个 列表 数据容器 , 用于控制 本应用 导入的 模块 中 可以使用 导入模块 的哪些 变量 / 函数 / 类 ;
Python 模块 被 应用导入时 , 系统会检查该模块是否定义了 __all__ 变量 :
- 如果有 定义
__all__变量 , 那么导入 该__all__变量 列表 元素 对应的 变量 / 函数 / 类 功能 ; - 如果没有 定义
__all__变量 , 那么导入该模块中所有功能 ;
2、__all__ 变量用法
在 模块 代码的 最上部定义 __all__ 变量 , 为其赋值一个 元素类型为 字符串类型 的 列表容器变量 ;
当使用
import module_name
from module_name import *
导入整个模块时 , 就会只导入 该 __all__ 变量 列表 元素 对应的 变量 / 函数 / 类 功能 ;
3、import 导入整个模块 - 执行阶段报错
使用
import module_name
导入整个模块 , 在执行阶段报错 , 如 :
Unresolved reference 'minus'

4、from 导入整个模块 - 编译阶段报错
使用
from module_name import *
导入整个模块 , 在编译阶段直接报错 , 无法执行 ;
Traceback (most recent call last):
File "D:\002_Project\011_Python\HelloPython\Hello.py", line 11, in <module>
num2 = my_module.miuns(2, 3)
AttributeError: module 'my_module' has no attribute 'miuns'
5、from 导入部分模块功能 - 编译阶段报错
如果使用
from my_module import minus
导入没有定义在 __all__ 变量 中的函数 , 则在编译阶段会报错 ;

在执行时 , 也会报错 NameError: name 'miuns' is not defined ;

二、代码示例
1、代码示例 - 模块中定义 __all__ 变量
在下面的 Python 模块代码中 , 定义 __all__ 变量 , 为其赋值 ['add'] 列表容器变量 ;
在该 Python 模块中 , 定义了两个函数 , add 函数 和 minus 函数 , 这两个功能可以设置到 __all__ 变量的 列表容器 中 ;
代码示例 :
__all__ = ['add']
def add(a, b):
print("调用 my_module 模块中的 add 功能")
return a + b
def minus(a, b):
print("调用 my_module 模块中的 minus 功能")
return a - b
if __name__ == '__main__':
print(add(3, 4))
print(minus(3, 4))
2、代码示例 - 使用 from 导入模块
使用
from my_module import *
导入上述 定义了
__all__ = ['add']
变量的 Python 模块 , 发现只能访问 add 函数 , 不能访问 minus 函数 ;
如果强行访问 minus 函数 , 在编译阶段 , 会报出
Unresolved reference 'minus'
错误信息 ;

代码示例 :
"""
自定义模块 代码示例
"""
# 导入自定义模块
from my_module import *
num = add(2, 3)
print(num)
# num2 = miuns(2, 3)
执行结果 :
D:\001_Develop\022_Python\Python39\python.exe D:/002_Project/011_Python/HelloPython/Hello.py
调用 my_module 模块中的 add 功能
5
Process finished with exit code 0

3、代码示例 - 使用 import 导入模块
完整代码 :
"""
自定义模块 代码示例
"""
# 导入自定义模块
import my_module
num = my_module.add(2, 3)
print(num)
num2 = my_module.miuns(2, 3)
print(num2)
执行结果 :
D:\001_Develop\022_Python\Python39\python.exe D:/002_Project/011_Python/HelloPython/Hello.py
Traceback (most recent call last):
File "D:\002_Project\011_Python\HelloPython\Hello.py", line 11, in <module>
num2 = my_module.miuns(2, 3)
AttributeError: module 'my_module' has no attribute 'miuns'
调用 my_module 模块中的 add 功能
5
Process finished with exit code 1
在下图的代码中 , 可以看到
num2 = my_module.miuns(2, 3)
代码在编译阶段 , 没有报错 , 但是在执行阶段 , 报错了 ;

4、代码示例 - 使用 from 导入模块功能
代码示例 :
"""
自定义模块 代码示例
"""
# 导入自定义模块
from my_module import minus
from my_module import add
num = add(2, 3)
print(num)
num2 = miuns(2, 3)
print(num2)
上述代码在编译时报错 , 程序无法完成编译 ;

强行运行上述代码 , 会报如下错误 :
D:\001_Develop\022_Python\Python39\python.exe D:/002_Project/011_Python/HelloPython/Hello.py
调用 my_module 模块中的 add 功能
5
Traceback (most recent call last):
File "D:\002_Project\011_Python\HelloPython\Hello.py", line 12, in <module>
num2 = miuns(2, 3)
NameError: name 'miuns' is not defined
Process finished with exit code 1
