__all__
的使用并不会改变一个package 所暴露的方法和变量,例如在grocery
package中,有以下的 __init__.py
文件:
def get_bread():
print('A bread.')
def get_coffee():
print('A cup of coffee.')
def get_milk():
print('Some milk.')
__all__ = ['get_bread', 'get_coffee']
你依然可以使用 from grocery import get_milk
获取 get_milk
方法.
__all__
的唯一影响是当你使用 wild import
的时候:from grocery import *
,只会导入 __all__
数组中包含的内容。换言之,使用 from grocery import *
时,get_milk
是不会被引入的。
同时也要注意,不要在 __all__
数组中包含没有定义的函数或变量。如果在 __all__
数组中包含没有定义的函数或变量,使用 import grocery
并不会出错(因为只会导入定义了的方法和变量)。但是使用 from grocery import *
时会出现未定义的错误。
所以 __all__
和python中的私有方法实现一样,都是约定俗成的协议。约定好了 __all__
中声明的内容就是 public api
。