`__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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。