Python學習(六)模組 —— 包

來源:互聯網
上載者:User

標籤:

Python 包  包 定義

    為了組織好模組,會將多個模組分為一個包。Python 處理包也是相當方便的。簡單來說,包就是檔案夾,但該檔案夾下必須存在 __init__.py 檔案

    常見的包結構如下:

    最簡單的情況下,只需要一個空的 __init__.py 檔案即可。當然它也可以執行包的初始化代碼,或者定義稍後介紹的 __all__ 變數。當然包底下也能包含包,這和檔案夾一樣,還是比較好理解的。

 

  匯入包

    包的匯入仍使用 import 、 from ... import 語句,使用 “圓點模組名” 的結構化模組命名空間。 下面來看一個包的例子來瞭解下具體的運作。(官方文檔中的例子)

    假設你現在想要設計一個模組集(一個“包”)來統一處理音效檔和聲音資料。存在幾種不同的聲音格式(通常由它們的副檔名來標識,例如: .wav, .aiff, .au )於是,為了在不同類型的檔案格式之間轉換,你需要維護一個不斷增長的包集合。可能你還想要對聲音資料做很多不同的操作(例如混音,添加回聲,應用平衡 功能,建立一個人造效果)所以你要加入一個無限流模組來執行這些操作。你的包可能會是這個樣子(通過分級的檔案體系來進行分組):

      

    使用者可以每次只匯入包裡的特定模組,例如: import sound.efforts.echo   這樣就匯入了 sound.effects.echo 子模組。它必須通過完整的名稱來引用。

     sound.effects.echo.echofilter(input, output, delay=0.7, atten=4) 

    匯入包時有一個可以選擇的方式: from sound.effects import echo   這樣就載入了 echo 子模組,並且使得它在沒有包首碼的情況下也可以使用,所以它可以如下方式調用

     echo.echofilter(input, output, delay=0.7, atten=4) 

 

     還有另一種變體用於直接匯入函數或變數: from sound.effects.echo import echofilter   這樣就又一次載入了 echo 字模組,但這樣就可以直接調用它的 echofilter() 函數

     echo.echofilter(input, output, delay=0.7, atten=4) 

 

    需要注意的是  from package import item    方式匯入包時,這個子項(item)既可以是子包也可以是其他命名,如函數、類、變數等。若無,會引發ImportError異常。

    而用類似 import item.subitem.subsubitem 這樣的文法時,這些子項必須是包,最後的子項可以是包或模組,但不能是類、函數、變數等

 

    從 * 匯入包

    import * 這樣的語句理論上是希望檔案系統找出包中所有的子模組,然後倒入它們。這可能會花長時間,並出現邊界效應等。Python 解決方案是提供一個明確的包索引。

    這個索引由 __init__.py  定義 __all__ 變數,該變數為一列表,如上例 sound/effects 下的 __init__.py 中,可定義  __all__ = ["echo","surround","reverse"] 

    這意味著,  from sound.effects import *   會從對應的包中匯入以上三個子模組; 儘管提供 import * 的方法,仍不建議在生產代碼中使用這種寫法。

    包內引用

    如果是子包內的引用,可以按相對位置引入子模組 以 echo 模組為例,可以引用如下:

1 from . import reverse              # 同級目錄 匯入 reverse2 from .. import frormats            # 上級目錄 匯入 frormats3 from ..filters import equalizer    # 上級目錄的filters模組下 匯入 equalizer

    多重目錄包搜尋

    包支援一個更為特殊的特性, __path__  在包的 __init__.py 檔案代碼執行前,該變數初始化一個目錄名列表。作用於子包和模組的搜尋功能。
    該功能可以用於擴充包中的模組集,不過不常用。

    

 

Python學習(六)模組 —— 包

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.