`__all__` 的使用

__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

你可能感兴趣的:(`__all__` 的使用)