Python 3.1 快速導覽 - 套件

套件 (package) 是 Python 用資料夾組織模組 (module) 檔案的方式,例如我們有三個模組

  • 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




3 則留言:

Unknown 提到...

最後面是from package01 import * 對嗎?

Kaiching Chang 提到...

是的,這邊漏打,已修改,感謝指正 ^_^

Unknown 提到...


好像也會錯誤
from myprog.module01 import *