- module01.py
- module02.py
- module03.py
三個模組檔案放在 package01 資料夾中, package01 就是套件名稱,這時 package01 資料夾需要有額外一個 __init__.py , __init__.py 可以不需要有任何內容,因為需要這個檔案,直譯器才能辨識 package01 為套件,如下圖
我們在 module01.py 設置以下的內容
class Demo: __x = 0 def __init__(self, i): self.__i = i Demo.__x += 1 def __str__(self): return str(self.__i) def hello(self): print("hello " + self.__str__()) @classmethod def getX(cls): return cls.__x class Other: def __init__(self, k): self.k = k def __str__(self): return str(self.k) def hello(self): print("hello, world") def bye(self): print("Good-bye!", self.__str__()) class SubDemo(Demo, Other): def __init__(self, i, j): super().__init__(i) self.__j = j def __str__(self): return super().__str__() + "+" + str(self.__j) if __name__ == "__main__": a = SubDemo(12, 34) a.hello() a.bye() b = SubDemo(56, 78) b.hello() b.bye() # 《程式語言教學誌》的範例程式 # http://pydoing.blogspot.com/ # 檔名:module01.py # 功能:示範 Python 程式 # 作者:張凱慶 # 時間:西元 2010 年 12 月
現在我們寫另外一個 packagedemo.py 來利用 package01 中 module01.py 所定義的 Subdemo 類別,注意packagedemo.py 必須放在與 package01 相同資料夾中,我們將這個資料夾命名為 packagedemo ,如下圖
以下程式為 packagedemo.py 的內容
from package01.module01 import SubDemo a = SubDemo(12, 34) a.hello() a.bye() b = SubDemo(56, 78) b.hello() b.bye() # 《程式語言教學誌》的範例程式 # http://pydoing.blogspot.com/ # 檔名:packagedemo.py # 功能:示範 Python 程式 # 作者:張凱慶 # 時間:西元 2010 年 12 月
執行結果如下
我們看到第 1 行引入套件的部份
from package01.module01 import SubDemo
首先是套件名稱,然後小數點符號,然後再接模組名稱,這是引入套件中模組依序的寫法。
那麼 __init__.py 除了讓直譯器識別資料夾為套件之外有什麼作用呢?這裡,我們可以在 __init__.py 裡提供一個 __all__ 變數,如下
__all__ = ["module01", "module02", "module03"]; # 《程式語言教學誌》的範例程式 # http://pydoing.blogspot.com/ # 檔名:__init__.py # 功能:示範 Python 程式 # 作者:張凱慶 # 時間:西元 2010 年 12 月
當 __all__ 被定義後,寫
from package01 import *
才能保證 module01 、 module02 及 module03 三個模組都被引入。
中英文術語對照 | |
---|---|
套件 | package |
模組 | module |
參考資料
http://docs.python.org/py3k/tutorial/modules.html
http://docs.python.org/py3k/reference/simple_stmts.html
http://docs.python.org/py3k/tutorial/modules.html
http://docs.python.org/py3k/reference/simple_stmts.html
3 則留言:
最後面是from package01 import * 對嗎?
是的,這邊漏打,已修改,感謝指正 ^_^
好像也會錯誤
from myprog.module01 import *
張貼留言