Python中__all__变量的作用与使用详解
本文详细解析Python中__all__全局变量的作用。在普通模块中,__all__用于指定允许通过from...import *导入的属性(如函数、类、全局变量);若未定义,则默认全部可导入(私有属性除外)。在包的__init__.py中,__all__控制from package import *的行为,明确列出需暴露的子模块。通过代码示例说明其如何限制或指定导入范围,并简述__init__.py中的初始化逻辑。
在Python中,每个.py文件被视为一个独立的模块。__all__是一个特殊的列表变量,它既可以定义在普通的.py模块文件中,也可以出现在包的__init__.py文件里。
1、在普通模块中使用__all__时,它的作用是明确指定该模块中哪些属性(如全局变量、函数或类)允许被其他模块通过通配符导入。
例如,我们可以参考test1.py和main.py这两个文件的具体实现。
test1.py
__all__=["test"]
def test():
print('----test-----')
def test1():
print('----test1----')
main.py
from test1 import * def main(): test() #test1() main()
假设这两个文件位于同一个目录下。
此时,若直接执行python main.py,其运行结果如下:

然而,如果取消main.py中的注释(即调用被__all__排除的函数),情况会发生变化,具体代码如下:

由此可见,模块中的__all__变量主要用于限制或指定能够被其他模块通过from...import *语句导入的内容,包括函数、类和全局变量。如果定义了__all__,则只有列表中包含的名称可以被导入;若未定义__all__,则默认模块中所有非私有(即不以单下划线开头)的名称均可被导入。
2、在包的__init__.py文件中使用__all__
例如,在sound/effects/__init__.py文件中添加__all__ = ["echo", "surround", "reverse"]。
这样,当执行from sound.effects import *时,只会导入__all__列表中指定的这三个子模块。需要注意的是,如果__init__.py文件为空,执行from sound.effects import *仅会导入sound.effects这个包本身,而不会自动导入其下的子模块。
此外,__init__.py文件还可以用于执行一些初始化操作,例如:
使用from . import test1可以导入当前目录下的test1模块。
使用from .. import test可以导入上一层目录下的test模块。
这是因为在导入包时,Python解释器会首先执行__init__.py文件中的代码。
以上关于Python模块导入时__all__全局变量作用的详解内容到此结束,希望能为读者提供有价值的参考,并欢迎大家继续支持本站获取更多技术资讯。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









