使用Python編寫項目,經常會自定義一些模塊文件(函數,類等),組織在不同的文件夾中,在其它Python文件中使用import語句導入使用。Python軟件包和普通的文件夾不同之處在于有一個特定文件“__init__.py”。當導入該軟件包中的模塊時,Python解釋器會首先執行該軟件包的“__init__.py”文件。
將一個文件夾用作Python軟件包時,該文件夾必須滿足以下條件:
(1)文件夾中必須包含一個名為“__init__.py”的文件,該文件可以為空,但必須存在。它告訴Python該文件夾是一個可導入的模塊或包。
(2)文件夾可以包含其他Python模塊、子文件夾和“__init__.py”文件。這些文件和文件夾可以包含Python代碼、函數、類等。
(3)軟件包可以有自己的“__init__.py”文件,該文件通常用于初始化軟件包或在導入軟件包時執行某些操作。
“__init__.py ”文件在Python中被用來標識一個目錄是一個Python包。其意義是:這個文件在以下幾種情況下會被自動執行:
(1)導入包:當你導入一個包的時候,Python會首先執行該包的 “__init__.py”?文件。這使得你可以在 “__init__.py”文件中定義包級別的變量,或者執行一些初始化代碼。
(2)包的初始化:當Python解釋器啟動時,它會查找所有的包,并執行每個包的 “__init__.py”文件。這使得你可以在包的級別上執行一些初始化代碼,例如設置環境變量或加載配置文件。
(3)包內直接引用:如果在包的某個模塊中需要引用包級別的變量或函數,那么Python會在加載該模塊時執行 “__init__.py”文件。
值得注意的是,雖然可以在 “__init__.py”?文件中執行任意Python代碼,但是有一些最佳實踐和建議:
(1)不要執行非初始化代碼:將 “__init__.py”?文件用于包的初始化,避免在其中執行可能會阻止包正常導入的代碼。
(2)使用相對導入:如果你需要在 “__init__.py”?文件中導入包內的其他模塊,請使用相對導入,以避免可能的循環導入問題。
(3)謹慎使用全局變量:在 “__init__.py”?文件中定義的變量是包級別的,可能會影響到包內的其他模塊。因此,應該謹慎使用全局變量。
(4)“__init__.py”文件中的代碼僅在導入該軟件包時執行一次。如果需要在每次導入該軟件包時都執行一些代碼,可以在該模塊中使用一個啟動函數或者鉤子,這樣當該模塊被導入時,該函數或鉤子將被調用。
將自定義模塊放在一個文件夾中作為軟件包的好處是,可以將相關的Python代碼組織在一起,方便管理和維護。此外,軟件包可以包含多個模塊,并且可以通過包管理工具(如pip)進行安裝和分發。這對于第三方庫和開源項目特別有用,因為它們可以被其他人輕松地安裝和使用。
另外:
Python在啟動時會執行所有的“__init__.py”文件來初始化包,這是為了設置環境變量或加載配置文件等。但是,當你在代碼中導入某個軟件包時,該軟件包中的“__init__.py”文件會被再次執行。這是因為“__init__.py”文件中的代碼是為包的導入而編寫的,它定義了包的結構和行為。
例如,“__init__.py”文件可以定義模塊的公開接口、設置模塊的屬性或狀態,或者進行其他與模塊相關的初始化操作。當模塊被導入時,這些初始化操作是必要的,因此“__init__.py`文件會被再次執行。
需要注意的是,“__init__.py”文件中的代碼只會在包首次被導入時執行一次。如果在之后的代碼中再次導入同一個包,“__init__.py”文件將不會被重新執行。這樣可以確保包的初始化操作只執行一次,避免重復執行初始化代碼或導致意外的副作用。