一個 Python 檔案就是一個模組 (module) ,模組內可以定義變數 (variable) 、函數 (function) 、類別 (class) 或是任何需要的程式內容
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_demo6 跟 module_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 |
$ |
不過 46 是 class_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 |
$ |
若是在 from 、 import 後改用星號 * ,這樣表示引入所有的識別字名稱。
模組用來整理程式內容, 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__": 陳述。 |
相關教學影片