Python 簡易手冊
單元 56 - 建構子與解構子
建構子 (constructor) 也就是 __init__() 方法 (method) ,主要用途是初始化物件 (object) ,包括設定實體物件屬性 (attribute) ,以下為建構子的簡單例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 定義類別 class Demo: # 定義建構子 def __init__(self, a, b): self.a = a self.b = b # 定義實體方法 def do_something(self): return self.a + self.b # 建立物件 a = Demo("Hello", "Python") # 印出實體方法的回傳值 print(a.do_something()) # 檔名: class_demo4.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
單元 54 - 類別介紹類別 (class) 的基本概念。
第 4 行定義 __init__() 方法, __init__() 就是實體方法 (instance method) 的一種,只是名稱是預設的,這是訂製物件預設的方式
3 4 5 6 | # 定義建構子 def __init__(self, a, b): self.a = a self.b = b |
單元 55 - 實體屬性與方法介紹如何定義實體方法,單元 60 - 資料類別與資料模型會介紹資料模型 (data model) 的基本訂製項目。
這個例子的 __init__() 方法初始化兩個實體屬性 (instance attribute) ,分別由兩個參數 (parameter) 設定,下面定義實體方法 do_something() 回傳兩個實體屬性的相加值
8 9 10 | # 定義實體方法 def do_something(self): return self.a + self.b |
然後注意到底下執行部分,建立 Demo 型態物件的第 13 行
12 13 14 15 | # 建立物件 a = Demo("Hello", "Python") # 印出實體方法的回傳值 print(a.do_something()) |
這裡 Demo("Hello", "Python") 就是呼叫 __init__() 方法,並提供兩個參數,此例執行結果如下
> python class_demo4.py |
HelloPython |
> |
解構子 (destructor) 則是訂製物件的資料模型中的另一個預設方法,也就是 __del__() ,這是在物件被資源回收以後執行的方法,以下示範定義 __del__()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 定義類別 class Demo: # 定義建構子 def __init__(self): print("建構子被呼叫") # 定義解構子 def __del__(self): print("解構子被呼叫") # 建立物件 a = Demo() # 檔名: class_demo5.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
這個例子很簡單,就是當 __init__() 被呼叫就印出訊息, __del__() 被呼叫也印出另一則訊息,執行結果如下
> python class_demo5.py |
建構子被呼叫 解構子被呼叫 |
> |
當建立 Demo 物件的時候, __init__() 就會執行,當程式結束執行,所有程式內容都會被直譯器 (interpreter) 資源回收,所以會自動執行 __del__() ,所以一般情況不需要自己定義解構子,但是如果屬性是可變資料型態或是自行設定的類別,這時候就需要自行設定解構子,例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # 定義類別 class Demo: # 定義建構子 def __init__(self): self.a = [1, 2, 3] # 定義解構子 def __del__(self): del self.a print("資料已刪除") # 建立物件 d = Demo() # 印出實體屬性 print(d.a) # 刪除物件 del d # 檔名: class_demo6.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
這裡由於屬性 a 是串列 (list) ,所以解構子中用關鍵字 (keyword) del 刪除屬性 a
7 8 9 10 | # 定義解構子 def __del__(self): del self.a print("資料已刪除") |
單元 32 - del 陳述介紹 del 陳述的用法, 單元 39 - 串列介紹如何定義串列。
然後底下建立物件,不用物件時一樣用關鍵字 del 刪除
12 13 14 15 16 17 | # 建立物件 d = Demo() # 印出實體屬性 print(d.a) # 刪除物件 del d |
這個刪除動作其實就這個程式而言是多餘的,因為刪除後就結束程式執行,直譯器會在程式結束後回收所有資源,寫出來的目的是示範不用物件的時候如何刪除物件,如果沒有刪除的話,該物件會持續佔用系統資源,另外屬性 a 由於是串列,這會額外佔據更多的系統資源,所以解構子中的刪除加上執行部分的刪除的主要用途都是釋放系統資源。
此例執行結果如下
> python class_demo6.py |
[1, 2, 3] 資料已刪除 |
> |
參考資料
- https://docs.python.org/3/tutorial/classes.html#class-objects
- https://docs.python.org/3/reference/datamodel.html#object.__init__