Python 入門指南

單元 12 - 模組

~~學習進度表~~

一個 Python 檔案就是一個模組 (module) ,模組內可以定義變數 (variable) 、函數 (function)類別 (class) 或是任何需要的程式內容

module
   variable
   function
   class

利用關鍵字 (keyword) import ,我們可以在模組裡用其他定義好的模組內容,下例示範引入上個單元的 class_demo6.py

import class_demo6

d = Demo(12, 13)
print(d.do_something())

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:module_demo.py
# 功能:示範 Python 中的模組
# 作者:張凱慶 */

import 通常寫在程式的頭幾行,此例寫在第一行,模組名稱就是檔案名稱,接著建立 Demo 型態的變數 d ,然後印出 do_something()回傳值 (return value) ,執行結果如下

$ python module_demo.py
46
Traceback (most recent call last):
  File "module_demo.py", line 3, in <module>
    d = Demo(12, 13)
NameError: name 'Demo' is not defined
$

咦?先跑出 46 ,然後是 Traceback 的敘述,這是什麼?

Traceback 是 Python 直譯器 (interpreter) 遇到無法執行的時候所提供的提示選項,這裡是說第 3 行的 Demo 沒有被定義,因而產生 NameError例外 (exception)

不是 import 了嗎?為什麼說 Demo 沒有被定義呢?這是因為 class_demo6module_demo 兩個各自的作用域 (scope) 不同, import 後要用 class_demo6 的內容必須連帶使用 class_demo6 ,這是說原本的 Demo 要改成 class_demo6.Demo ,如下

import class_demo6

d = class_demo6.Demo(12, 13)
print(d.do_something())

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:module_demo2.py
# 功能:示範 Python 中的模組
# 作者:張凱慶 */

這樣執行結果就沒有問題囉

$ python module_demo2.py
46
25
$

不過 46class_demo6.py 的執行結果,由於 import 的機制會把引入模組中所有未縮排的程式碼都執行一次,所以執行 module_demo2.py 等於會先執行 class_demo6.py

那我們是否應該把執行程式的模組跟放定義的模組分開來呢?大可不必,很多時候我們需要直接測試定義是否合用,因此直接放在相同檔案裡會比較方便,可是當作為其他檔案引入的時候,我們得用一套機制來區分引入跟非引入的情況,這個就利用 Python 執行環境的預設變數 __name__ 了,當這個變數等於 "__main__" 的時候,就代表目前的模組是執行程式。

我們把 class_demo6.py 修改成 class_demo9.py ,如下

class Demo:
  def __init__(self, v1=11, v2=22):
    self.__a = v1
    self.__b = v2
    
  def do_something(self):
    return self.__a + self.__b
    
if __name__ == "__main__":
  d = Demo(12, 34)
  print(d.do_something())

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:class_demo9.py
# 功能:示範 Python 中的模組
# 作者:張凱慶 */

我們再用以下的 module_demo3.py ,連帶介紹另一個關鍵字 from

from class_demo9 import Demo

d = Demo(12, 13)
print(d.do_something())

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:module_demo3.py
# 功能:示範 Python 中的模組
# 作者:張凱慶 */

第 1 行, from 加上 import 可從模組中引入指定的識別字 (identifier)

from class_demo9 import Demo

因此下面就可以直接使用 Demo ,無須加上模組的名稱。執行結果如下

$ python module_demo3.py
25
$

若是在 fromimport 後改用星號 * ,這樣表示引入所有的識別字名稱。

模組用來整理程式內容, Python 另外用套件 (package) 整理模組,好比資料夾之於檔案,不過這不在我們目前的討論範圍,接下來我們來討論可定義在模組函數類別或方法 (method) 中的文件字串 (documentation string) 。

中英文術語對照
類別class
文件字串documentation string
例外exception
函數function
識別字identifier
直譯器interpreter
關鍵字keyword
方法method
模組module
套件package
回傳值return value
作用域scope
變數variable
重點整理
1. 一個 Python 檔案就是一個模組,多個模組可用套件組織管理。
2. 若預設變數 __name__ 等於 "__main__" 的時候,表示此時這個模組為執行程式。
3. 關鍵字 import 用來引進模組,與 from 合用則引進模組中定義的名稱,另可用星號表示引入所有名稱。
問題與討論
1. 若甲模組中先 import 乙模組,若在程式檔案中先 import 甲模組,又 import 乙模組,這樣會發生問題嗎?
2. 為什麼模組要設計成沒有縮排的程式碼會先被執行?
練習
1. 寫一個程式 exercise1201.py ,替 exercise1101.py 加入 if __name__ == "__main__": 陳述。
2. 寫一個程式 exercise1202.py ,替 exercise1102.py 加入 if __name__ == "__main__": 陳述。
3. 寫一個程式 exercise1203.py ,替 exercise1103.py 加入 if __name__ == "__main__": 陳述。

相關教學影片

上一頁 單元 11 - __init__() 方法
回 Python 入門指南首頁
下一頁 單元 13 - 文件字串
回 Python 教材首頁
回程式語言教材首頁