请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于__all__属性

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__的列表里?

正在回答 回答被采纳积分+3

2回答

7七月 2020-08-03 15:24:34

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

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

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

0 回复 有任何疑惑可以回复我~
7七月 2020-08-03 03:54:01

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

0 回复 有任何疑惑可以回复我~
  • 提问者 易萧 #1
    视频中展示的是,在__all__设置为['c7']后的运行结果,但是没有展示不设置__all__,能否把c7和c8都打印出来。
    from t import *
    如果不设置__all__,这句应该是会把t包里所有模块都导入进来的 。
    但是我这里不行,除非设置__all__=['c7','c8']
    只有当from import的是模块的里的变量,才是可以全部导入的。
    回复 有任何疑惑可以回复我~ 2020-08-03 12:51:38
  • 提问者 易萧 #2
    如果不设置__all__
    那么
    from t import *
    print(c7.a)
    print(c8.e)
    c7和c8两个都打印不出来,都提示 not defined
    回复 有任何疑惑可以回复我~ 2020-08-03 12:53:33
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信