1. 程式人生 > >python-模組和包

python-模組和包

模組:

1. 一個py檔案,就是一個模組,檔案中包括定義的函式和類等資訊。

2. 儘管可以import多次,實際上模組只匯入一次

3. 模組搜尋路徑 記憶體中已經載入的模組->內建模組->sys.path路徑(導模組的環境變數)中包含的模組 

4. 匯入模組

      將整個模組匯入   import 模組名

      匯入所有函式  from 模組名 import * 

     從模組中匯入某個函式 from 模組名稱 import 函式1(, 函式2...) 也可以是屬性

     使用區別

          

          import 模組名和form 模組名 import *,呼叫模組函式(屬性)時的格式是 模組.

函式屬性)

          from 模組名 import  函式名(屬性名),這可以直接使用,無需新增模組名

包:

      假設目錄結構如圖:

 1. 當一個目錄內含有__init__ . py檔案時,就可以視該目錄為一個包,因此圖中Model和 Basenodel logmodel都是包

 2. 匯入包

   (1)import 包名;  import Model.Basemodel,  importModel,  import Basemodel;使用該模組下的方法時,需要將import之後名稱全部加上,方可呼叫成功。

             

           該操作只能匯入該包下的模組,不能匯入子包中的模組;也不能通過通過包名.報名.模組.函式(變數)來訪問。

            直接匯入Model,Model中包含包

                    

            提示屬性不存在,將Basemodel當作模組呼叫

                   

   (2)from 包名.[包名. ]   import 模組名(模組名字之前不能有'包名.'):  from Model.Basemodel import Image 

   (3)from  包名.[包名. ]   import *

 3. __init__檔案

      (1) 該檔案,可以表示該目錄是一個包,內容可以為空,第一次匯入包或者是包的任何其他部分,實際就是匯入該檔案。因此,我們在該檔案中匯入需要的模組(別人在匯入包的同時,也就匯入__init__檔案中的模組),這樣在使用時,使用者感覺可以將這個包當作模組使用,而不關心其背部結構。

       例如:Model包中的__init__檔案內容如下:

         

         其他模組在匯入時,就可以簡單的使用,不用關心其內部結構(使得匯入包 嚮導入模組一樣簡單)

         

        

       

   (2) 特殊變數 __all__

          __init__不僅僅用來匯入模組,其本身也可以加入程式碼,其中存在特殊變數__all__ ,該變數是一個列表,列表中以字串的格式存放變數或者函式,在執行 form 包 import * 時,匯入該列表內容。示例:

          列表中添加了add函式和xx變數

其他模組執行 from Model import *,

         

   執行結果:

       

      提示mul函式未定義,因為該函式不在__all__列表中

 4.相對路徑匯入

             

             在此目錄結構中,__init__ 和 Basemodel 在同一目錄下,因此在__init__檔案中想要匯入BaseModel檔案,可以使用相對路徑,也就是使用linux系統中的 .(本目錄) 和..(上級目錄),並且只能在一個目錄中使用,不能用於不同目錄內

                    

                   此截圖,使用的就是'.',意思是同級目錄下的Basemodel包,而不會去尋找其他包。