Python學習(六)模塊 —— 包

Python 包

  包 定義

    爲了組織好模塊,會將多個模塊分爲包。Python 處理包也是至關方便的。簡單來講,包就是文件夾,但該文件夾下必須存在 __init__.py 文件函數

    常見的包結構以下:spa

    最簡單的狀況下,只須要一個空的 __init__.py 文件便可。固然它也能夠執行包的初始化代碼,或者定義稍後介紹的 __all__ 變量。固然包底下也能包含包,這和文件夾同樣,仍是比較好理解的。設計

 

  導入包

    包的導入仍使用 import 、 from ... import 語句,使用 「圓點模塊名」 的結構化模塊命名空間。 下面來看一個包的例子來了解下具體的運做。(官方文檔中的例子)code

    假設你如今想要設計一個模塊集(一個「包」)來統一處理聲音文件和聲音數據。存在幾種不一樣的聲音格式(一般由它們的擴展名來標識,例如: .wav, .aiff, .au )因而,爲了在不一樣類型的文件格式之間轉換,你須要維護一個不斷增加的包集合。可能你還想要對聲音數據作不少不一樣的操做(例如混音,添加回聲,應用平衡 功能,建立一我的造效果)因此你要加入一個無限流模塊來執行這些操做。你的包可能會是這個樣子(經過分級的文件體系來進行分組):orm

      

    用戶能夠每次只導入包裏的特定模塊,例如: import sound.efforts.echo   這樣就導入了 sound.effects.echo 子模塊。它必須經過完整的名稱來引用:blog

     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) input

 

     還有另外一種變體用於直接導入函數或變量: from sound.effects.echo import echofilter   這樣就又一次加載了 echo 字模塊,但這樣就能夠直接調用它的 echofilter() 函數:it

     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              # 同級目錄 導入 reverse
2 from .. import frormats            # 上級目錄 導入 frormats
3 from ..filters import equalizer    # 上級目錄的filters模塊下 導入 equalizer

    多重目錄包搜索

    包支持一個更爲特殊的特性, __path__  在包的 __init__.py 文件代碼執行前,該變量初始化一個目錄名列表。做用於子包和模塊的搜索功能。    該功能能夠用於擴展包中的模塊集,不過不經常使用。

相關文章
相關標籤/搜索