Python 入門指南 V2.00 - 單元 12 - 模組




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



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


001import class_demo6
002
003d = Demo(12, 13)
004print(d.do_something())
005 
006# 檔名: module_demo.py 
007# 作者: Kaiching Chang 
008# 時間: July, 2014

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



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


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


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


001import class_demo6
002
003d = class_demo6.Demo(12, 13)
004print(d.do_something())
005 
006# 檔名: module_demo2.py 
007# 作者: Kaiching Chang 
008# 時間: July, 2014

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



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


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


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


001class Demo:
002   def __init__(self, v1=11, v2=22):
003      self.__a = v1
004      self.__b = v2
005   
006   def do_something(self):
007      return self.__a + self.__b
008
009if __name__ == "__main__":
010   d = Demo(12, 34)
011   print(d.do_something())
012 
013# 檔名: class_demo9.py 
014# 作者: Kaiching Chang 
015# 時間: July, 2014

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


001from class_demo9 import Demo
002
003d = Demo(12, 13)
004print(d.do_something())
005 
006# 檔名: module_demo3.py 
007# 作者: Kaiching Chang 
008# 時間: July, 2014

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


001from class_demo9 import Demo

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



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

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


中英文術語對照


模組module
變數variable
函數function
類別class
關鍵字keyword
回傳值return value
直譯器interpreter
例外exception
作用域scope
識別字identifier
套件package
方法method
文件字串documentation string

重點整理


  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__": 陳述。

the end

沒有留言: