关于__all__属性

来源:7-9 __init__.py 的用法

易萧

2020-08-02

package1/package1_sub1/init.py

__all__ = ['demoo']

package1/demo.py

from package1_sub1 import *
print(demoo.a)

如上,我在package1/package1_sub1/init.py里写上了__all__=[‘demoo’]后,再在demo.py里直接使用demoo.a是可以的,运行正常。

但是如果没有写上__all__=[‘demoo.py’](空的__init__.py文件),运行就会出现如下提示:

  • NameError: name ‘demoo’ is not defined.

all__属性不是用来限制的吗,如果__init.py中没有对__all__的范围指定一个具体列表,那么在导入该包的时候,应该是导入其下的所有模块才对吧。
可是现在看来,如果想要直接一次性导入所有package1_sub1包里的模块,还必须把所有模块都添加到所属包的__all__的列表里?

写回答

2回答

7七月

2020-08-03

__all__ 在__init__中写的时候,指定自动导出的包。如果没有在__init__的all中定义的包不会被自动导出

__all__在模块中写的时候,只有在__all__中指定的变量名才会被导出,如果没有__all__则全部导出

好好体会下,模块和包的导出区别

0
0

7七月

2020-08-03

__all__确实是用来限制的,我不太清楚你具体的测试代码,建议再重新看一遍是不是有什么误区

0
2
易萧
如果不设置__all__ 那么 from t import * print(c7.a) print(c8.e) c7和c8两个都打印不出来,都提示 not defined
2020-08-03
共2条回复

Python3.8系统入门+进阶 (程序员必备第二语言)

语法精讲/配套练习+思考题/原生爬虫实战

14598 学习 · 4469 问题

查看课程