理解 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 時,就不會執行判斷句中的內容。