在读 Django 源码时发现了这个 __all__:
https://github.com/django/django/blob/master/django/http/__init__.py
__all__ 是一个 list,里面装着字符串形式的变量名。
举个例子来看它的用法:
在同一目录下的两个 .py 文件,一个是 foo.py,一个是 bar.py。
# foo.py
a = 5
b = 3
我们运行 bar.py
# bar.py
from foo import *
print(a)
print(b)
输出:
5
3
现在改写一下 foo.py
# foo.py
a = 5
b = 3
__all__ = ['a']
再次运行 bar.py 则会报错,因为 b 无法被导出了。
NameError: name 'b' is not defined
但是这不是绝对的,因为 __all__ 只能限制 from module import *
这种形式,因此可以加一行:
from foo import b
这样就不会报错了。
在 python 的世界里,没有真正的私有对象。
all 仅对 from ... import * 起作用。