__all__ 的使用并不會(huì)改變一個(gè)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__ 的唯一影響是當(dāng)你使用 wild import 的時(shí)候:from grocery import *,只會(huì)導(dǎo)入 __all__ 數(shù)組中包含的內(nèi)容。換言之,使用 from grocery import * 時(shí),get_milk 是不會(huì)被引入的。
同時(shí)也要注意,不要在 __all__ 數(shù)組中包含沒(méi)有定義的函數(shù)或變量。如果在 __all__ 數(shù)組中包含沒(méi)有定義的函數(shù)或變量,使用 import grocery 并不會(huì)出錯(cuò)(因?yàn)橹粫?huì)導(dǎo)入定義了的方法和變量)。但是使用 from grocery import * 時(shí)會(huì)出現(xiàn)未定義的錯(cuò)誤。
所以 __all__ 和python中的私有方法實(shí)現(xiàn)一樣,都是約定俗成的協(xié)議。約定好了 __all__ 中聲明的內(nèi)容就是 public api。