歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

關於Python中 __init__.py

python  __init__.py

常見的情況中,我們將自己寫好的代碼轉化為函數的話去調用的話,都是事先寫好一個.py結尾的文件,將這個文件copy到當前目錄下,或者是在python的sys.path中事先定義好的路徑中去。之後在另一個文件中調用的時候,然後在另一個文件中去import。這樣的做法是不可行的!!如果你寫的程序層級過多,數目很多,就非常非常的吃力了。沒事兒,只要理解了python包的概念,以及__init__.py在包裡(包就是目錄)的作用就可以將很多個.py文件組織起來,方便外部統一調用,內部互相調用!
 
Python中目錄結構如下:
 
Directory1/
    __int__.py
    System_rui.py
    Diskspace_rui.py
    Directory2/
        __int__.py
        Hello_rui.py
        Backup_rui.py
 
如上:Diretory1是頂層的包,system_rui.py等是他的子包。我們在這裡發現了有很多的__init__.py的文件?
如果 __init__.py 不存在,這個目錄就僅僅是一個目錄,而不是一個包,它就不能被導入或者包含其它的模塊和嵌套包。
 

解釋:原來在python模塊的每一個包中,都有一個__init__.py文件(這個文件定義了包的屬性和方法)然後是一些模塊文件和子目錄,假如子目錄中也有 __init__.py 那麼它就是這個包的子包了。當你將一個包作為模塊導入(比如從 xml 導入 dom )的時候,實際上導入了它的 __init__.py 文件。一個包是一個帶有特殊文件 __init__.py 的目錄。__init__.py 文件定義了包的屬性和方法。其實它可以什麼也不定義;可以只是一個空文件,但是必須存在。
 
要弄明白這個問題,首先要知道,python在執行import語句時,到底進行了什麼操作,按照python的文檔,它執行了如下操作:
第1步,創建一個新的,空的module對象(它可能包含多個module);
第2步,把這個module對象插入sys.module中
第3步,裝載module的代碼(如果需要,首先必須編譯)
第4步,執行新的module中對應的代碼。
 
在執行第3步時,首先要找到module程序所在的位置,其原理為:
如 果需要導入的module的名字是m1,則解釋器必須找到m1.py,它首先在當前目錄查找,然後是在環境變量PYTHONPATH中查找。 PYTHONPATH可以視為系統的PATH變量一類的東西,其中包含若干個目錄。如果PYTHONPATH沒有設定,或者找不到m1.py,則繼續搜索 與python的安裝設置相關的默認路徑,在Unix下,通常是/usr/local/lib/python。
事實上,搜索的順序是:當前路徑 (以及從當前目錄指定的sys.path),然後是PYTHONPATH,然後是python的安裝設置相關的默認路徑。正因為存在這樣的順序,如果當前路徑或PYTHONPATH中存在與標准module同樣的module,則會覆蓋標准module。也就是說,如果當前目錄下存在xml.py,那麼執 行import xml時,導入的是當前目錄下的module,而不是系統標准的xml。
 

 
了解了以上。咱們來自己構建一個包。
創建一個包:
Directory1/
    __int__.py
    System_rui.py
    Diskspace_rui.py
    Directory2/
        __int__.py
        Hello_rui.py
        Backup_rui.py
Python中的Directory1中必須包含一個__init__.py的文件、只要它存在,就表示這個目錄被作為一個包暴力。我們在system_rui.py中定義一個函數:
 
def systemrui():
print”systemrui in module”
return
 
在python解釋器運行:
 
>>>from Directory1.system_rui.py import systemrui
>>> sytemrui()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name 'sytemrui' is not defined
 
函數為什麼會調用失敗呢,原因是就在__init__.py中。我們在Directory1的__init__.py文件中寫

__all__ = ['systemrui_rui']
 
然後再次進入python解釋器:
 
>>> from Directory1.system_rui import systemrui
>>> systemrui()
systemrui in module
 
結束

Copyright © Linux教程網 All Rights Reserved