理解 Python package & module 入門

Python 簡單易學,並且 Python 扮演了非常好的膠水的角色,將大量功能強的大模組整合在一起,讓他成為如今火熱的程式碼。

在這裡主要會說明 Package, Module 的組成。

首先聊聊 Module

在 python 來說,我們主要都會透過 module 來將建構我們的程式碼,一個 module 簡單來說,就是一個 .py 檔案。

├── mymodule.py

例如,建立一個 saymodule.py

class sayHello():
    name = ''
    message = 'hello world'
    def To(self):
        if self.name == '':

if __name__ == '__main__':
    sayhello = sayHello()
    sayhello.name = 'adam'
    sayhello.To()

接著在 main.py 導入

from saymodule import sayHello

sayhello = sayHello()
sayhello.name = 'brother'
sayhello.To()

Python, package 與 module 的關係

在前面提到,我們可以獨立建立 module 方式來引入使用,

但是,為了可以更好的將 package 區隔開,會再透過 package,將多個 module 整合成一個 package,這個打包好的 package,就可以很方便地被拿來使用,並且,package 必須包含 __init__.py,結構如下:

package
├── __init__.py
├── mymodule.py

引用一個 package 指定的 module 方式如下:

from package.mymodule import myFunction

另外,package 裡可以再延伸 sub-package ,例如


mypackages
├── __init__.py
├── mymodule.py
├── subpackage
    └── __init__.py
    └── mysubmodule.py

引用 subpackage

from mypackages.subpackage.mysubmodule import mySumFunc
from mypackages.mymodule import myFunction

例如,mypackages/mymodule.py

class myModule():
    message = 'helloworld'
    def show(self):
        print(self.message)

引入此 package 的 module :

from mypackages.mymodule import myModule

md = myModule()
md.show()

__init__.py 是什麼意思?

在 package 都必須要包含一個 __init__.py 檔案,主要用途是用來宣告目前資料夾會作為 package

首先,__init__.py 可以為空,單純用在宣告 package 用途,

同時,__init__.py 也可用來定義 package 中的 module 能否被引用。

import mysubmodule

我們可以 __init__.py 裡面定義變數 __all__ 來匯入指定的 module,例如:

__all__ = ['os', 'sys', 're', 'mysubmodule']

如果透過 * 不指定的情況

from package import *

在預設情況,package 所包含的內容載入的順序為

  • __init__.py 定義的執行代碼
  • __init__.py 所定義的變數
  • 導入 module

範例說明:

這裏有一個 package

mypackages
├── __init__.py
├── mymodule.py

__init__.py 我們先引入 module

import mymodule

# 也可使用 __all__

__all__ = ['mymodule']

接著,在其他程式就可直接載入套件,並且自動會包含 module

from mypackages import *
md = mymodule.myModule()
md.show()

什麼是 if __name__ == '__main__'

在前面,在 module 的範例中,我們使用到了以下語句

if __name__ == '__main__'

可以從 saymodule.py 看到,除了定義好的類別,另外在下方有呼叫類別及打印的行為

saymodule.py

class sayHello():
    name = ''
    message = 'hello world'
    def To(self):
        if self.name == '':

if __name__ == '__main__':
    sayhello = sayHello()
    sayhello.name = 'adam'
    sayhello.To()

如果單獨執行 saymodule.py,會輸出以下字句

hello world adadm

因為 saymodule.py 會被其他程式載入使用,我們只想使用類別,而不希望執行的行為一起引入,

所以可透過 if __name__ == '__main__' ,在其他檔案載入此 module 時,就不會執行判斷句中的內容。