06.16 Python 中的包 Packages

Python 中的包 Packages

這篇文章,介紹 Python 中的包(Package)是什麼。一個包可以包含多個模塊(module)。

包是一個目錄,裡面包含一些 Python 文件和 一個名字是 __init__.py 的文件。就是說,只要目錄裡有個 __init__.py 的文件,你就可以把它當做一個包。

包名相當於模塊的命名空間 Namespace,訪問的時候使用點操作符 dotted module names 訪問。例如 A.B 意思是包名為 A,訪問它裡面的模塊 B。

不同的包裡面可以有相同名稱的模塊。

例子


要創建一個包,首先創建一個目錄。假定我們要創建的包名是 simple,就要創建一個名字是 simple 的目錄,然後裡面再添加一個文件 __init__.py。這樣包 simple就創建完成了。

接下來添加一個模塊,比如叫 foo,就是要創建一個文件名是 foo.py 的文件,添加如下代碼:

Python 中的包 Packages

現在,進入到 shell 交互環境:

Python 中的包 Packages

注意首先切換到 simple 的目錄,然後進入到交互環境。這樣導入模塊是就可以在當前路徑中查找,默認當前路徑是在 Python 的搜索路徑中。

我們可以看到,使用 import simple 成功導入。但是通過點操作符訪問模塊 foo,提示屬性未找到。

模塊 foo 沒有導入進來,我們可以使用 from ... import ... 導入模塊。

Python 中的包 Packages

也可以使用點操作符直接導入 foo 模塊:

Python 中的包 Packages

使用 from simple import foo 導入了模塊 foo,也可以訪問模塊的 bar 方法。

自動導入模塊


當我們使用 import simple 導入 simple 包時,不會自動導入 foo 模塊。那麼,怎麼樣才能自動導入 foo 呢?只需要修改 __init__.py ,使用 import 語句導入 foo 模塊。

Python 中的包 Packages

接著退出終端,重新進入,導入 simple,請看輸出:

Python 中的包 Packages

當導入 simple 時,__init__.py 文件自動執行,第一行語句導入了模塊 foo。在終端上顯示,可以成功訪問到。

__init__.py 文件的第二行打印了一行簡單的字符串,當導入 simple 時,可以在終端上看到輸出。

使用相對路徑導入模塊


包可以嵌套,假如在 simple 包中,嵌套了一個子包叫 sub,目錄結構如下:

Python 中的包 Packages

如果想在 sub 包導入的時候,自動導入 simple.foo 模塊,可以在 sub/__init__.py 中導入:

Python 中的包 Packages

這裡使用 from .. import foo,從上級包導入模塊 foo。.. 代表上級包。

切換到終端,查看導入後結果:

Python 中的包 Packages

注意,不僅僅導入了 foo 模塊,simple/__init__.py 也自動執行了

使用 from . import x 代表從當前包導入模塊 x,例如在 sub 包中增加一個模塊 ss.py。

那麼可以在 sub/__init__.py 使用 from . import ss 自動導入 ss 模塊。

Python 中的包 Packages

打開終端,導入後輸出:

Python 中的包 Packages


分享到:


相關文章: