__all__ 是幹嗎用的?

前言

前兩天寫代碼的時候在一個簡單的導入操做上居然卡了有半小時之多,弄了半天才發現問題所在,分享給你們,但願對你們有所借鑑。python

from 模塊 import *

咱們導入模塊一般用 from 模塊名 import * , 以前我一直認爲,就是導入這個模塊內的全部屬性和方法,但事實並不是如此,python 經過 __all__內置變量來決定 哪些屬性和方法可供外部使用,咱們具體來看例子:git

咱們首先建立個 了 text1.py 文件 ,內容以下:github

# 測試變量param1 = "param1"param2 = "param2"# 測試函數def test1(): print("method test1() has been used")def test2(): print("method test2() has been used")# 測試類, 這裏從新定義了魔法方法__call__,使得對象實例也能夠像方法同樣被調用class Test1(): def __call__(self): print("class Test1() has been used!")class Test2(): def __call__(self): print("class Test2() has been used!")__all__ = ['param1', 'test1', 'Test1']if __name__ == "__main__": # 當前程序文件使用相關變量、方法、類 print(param1, param2) test1() test2() T1 = Test1() T1() T2 = Test2() T2()

咱們能夠看到 ,在test1.py模塊文件內部,咱們能夠順利的調用全部的測試變量,測試類,測試方法,另外,咱們在模塊文件內部定義了 __all__ = ['param1', 'test1', 'Test1'],這個有什麼用呢,咱們暫時看不出.web

咱們再新建個test2.py文件,內容以下:微信

from test1 import *try: print(param1)except NameError as err: print(err, ", no variable param1")try: print(param2)except NameError as err: print( "no variable param2")try: test1()except NameError as err: print(err, ", no method test1()")try: test2()except NameError as err: print("no method test2()")try: T1 = Test1() T1()except NameError as err: print(err, ", no calss Test1()")try: T2 = Test2() T2()except NameError as err: print("no class T2()")

執行結果以下:架構

param1no variable param2method test1() has been usedno method test2()class Test1() has been used!no class T2()

從執行結果能夠看出,雖然咱們在test2.py文件開頭就用from test1 import * 導入了test1 模塊中的全部變量和 函數方法,但從結果彷佛不是如此,param2,test2(),和Test2都找不到,也就是沒導入進來,而這幾個變量或者方法偏偏是 在 test1.py 模塊文件中的 __name__ 變量沒有定義的, 因此,並非 from 模塊名 import *就導入 該模塊的全部內容,而是一次導入模塊中經過__all__變量指定的全部對象。因此,咱們能夠經過__all__變量 來決定哪些內容是否要提供給外部調用。app

思考題 ,模塊中 定義的私有變量(單下劃線或雙下劃線) 是否也受 all 變量控制?函數


本文分享自微信公衆號 - 軟件測試架構師俱樂部(gh_03227f9a322f)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。測試

相關文章
相關標籤/搜索