你常常看到的 __init__.py 到底是個啥?
當你去看一些 Python 相關的專案時,常常會看到 __init__.py,當你使用某些編輯器建立 Python Package 的時候,它也會自動給你生成一個 __init__.py 檔案。
這玩意有什麼用呢?
我們知道, Python 中的包是可以包含多個 py 模組的,我們可以在不同的地方通過包名區分使用這些模組。
話不多說,我們們先來建立一下這樣的目錄:
我們在這裡面建立了三個 Python 子包,裡面都有 __init__ 和 module 的 py 檔案。
我們分別在不同包下的 __init__ 中寫一個 print 語句:
接著我們進入 Python ,分別來匯入這些模組:
可以看到,當我們匯入父模組中的子模組的時候,它會優先執行父模組中的 init ,接著會執行指定模組中的 init。
當然,只是匯入父模組的時候只會執行父模組中的 init:
也就是說,當我們去 import 一個 Package 的時候,它會隱性的去執行 __init__.py , 而在 __init__.py 中定義的物件,會被繫結到當前的名稱空間裡面來。
比如有時候我們會這樣去匯入一個包下的所有模組,會這樣操作:
但這個時候你會發現並沒有將相關的子模組匯入進來:
這時候你可能想到了,可以在父模組中的 __init__.py 做文章,先把它們匯入進來不就行了:
這裡的 __all__ 相當於匯入 [] 裡面定義的模組。
這次再匯入:
可以看到,所有子模組就都一併匯入進來了。
當然,你也可以在 __init__.py 做一些初始化的操作,比如資料庫 session 的建立:
其實在 Python3.2 版本之前,定義的 Package 下面一定要有 __init__.py 檔案,這樣 Python 才知道它是一個 Package,才可以尋找到相關模組的路徑從而被 import。
而在 Python3.2 之後的版本就不需要再額外的去專門建立一個 __init__.py 來告訴 Python 它是一個 Package 了,因為現在建立的包叫 Namespace package, Python 可以自動搜尋 Package 路徑,哪怕你的父包路徑發生了改變,你在下次匯入的時候, Python 還是會自動重新搜尋包路徑。
我們把剛剛定義的 __init__ 都給刪掉試試:
接著我們在 Python3.8 版本匯入看看:
可以看到,儘管我們在 package 中沒有定義 __init__.py,依然可以匯入使用。
以同樣的形式,我們在 Python2 中匯入看看:
可以看到,它被整懵逼了...
綜上,__init__.py 會在 import 的時候被執行,而空的 __init__.py 在Python 新版本中已經不需要你額外去定義了,因為就算你不定義 init, Python 也知道你匯入的包路徑,但是如果你想要做一些初始化操作,或者像我們剛剛說的預先匯入相關的模組,那麼定義 __init__.py 還是很有必要的喲。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2730780/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Webhook到底是個啥?WebHook
- resnet到底是個啥
- socket 到底是個啥
- 一文帶你搞懂 RPC 到底是個啥RPC
- Java中的反射到底是個啥?Java反射
- [譯] Flutter 元件到底是個啥?Flutter元件
- Java築基 - JNI到底是個啥Java
- 【Flutter脫髮錄】RenderObject到底是個啥?FlutterObject
- 零信任到底是啥?三堂課帶你看懂他!
- 計算機中的流水線技術到底是個啥?計算機
- 資料分析師到底是幹啥的?
- __init__.py
- 下一個時代的發展架構竟然是它!FaaaaaaaaS到底是個啥?架構
- 2022 年最受矚目的新特性 CSS @layer 到底是個啥?CSS
- 傳說中 VUE 的“語法糖”到底是啥?Vue
- 你幹啥的?LombokLombok
- [PHP 原始碼] EXPECTED 和 UNEXPECTED 到底是啥?PHP原始碼
- Python: __init__.py 作用Python
- 啥 啥 啥,服務治理是個啥
- 從Hash Join的執行計劃的細節中能看到點啥
- 一鍵變老,一鍵還童,一鍵變性!這個全球霸屏的 FaceApp 到底是個啥?APP
- 《跬步千里系列》高效能MySql之索引到底是個啥MySql索引
- 離開Google,你到底是做了一個怎樣的決定Go
- 現在常說的 宣告式,狀態 到底是個啥?一篇文章淺聊清楚
- 生物醫學中常常使用的光源
- 看看這個常常被初級程式設計師弄不懂的 “事件”程式設計師事件
- 雲端計算到底是個啥?運維必須掌握雲端計算的理由是什麼?運維
- MQTT 協議是個啥?這篇文章告訴你!MQQT協議
- 啥?你的 Tap bar 不夠花裡胡哨,試試這個!
- 你說寫程式碼,最常用的3個設計模式是啥?設計模式
- 一個基於運氣的資料結構,你猜是啥?資料結構
- Vue還有這種騷操作?淺析幾個新手常常忽略的APIVueAPI
- 人工智障 2 : 你看到的AI與智慧無關AI
- 三次給你講清楚Redis之Redis是個啥Redis
- Spring是個啥?Spring
- module.exports實現原理以及和exports到底是啥關係Export
- 微服務?資料庫?它們之間到底是啥關係?微服務資料庫
- 弄清楚,你要的到底是什麼