建構子(Constructor)
實例化物件時, 會自動執行的方法, 稱為建構子.
在Python中的建構子都是 __init__(self)
在Java及C#, 建構子名稱與類別名稱相同.
預設建構子
__init__的參數除了self外, 沒有其他的參數, 稱為預設建構子. 如下面的代碼, 在實例化物件時, 不需要也不可以傳入任何參數.
下面的代碼有幾個地方要澄清一下
1. 在class下有一個變數 level, 稱為物件變數. 在方法或建構子中如果要取用物件變數, 一定要加上 self.level.
2. 若沒有加 self, 則是建立區域變數, 所以在 __init__()內, 有一個 self.level的物件變數, 及一個level的區域變數
class Pokemon(object): count=0 #類別變數 def __init__(self): self.level=100 #物件變數 level=10 #區域變數 print("Pokemon出生了, 等級為%d" % self.level) p1=Pokemon() p1.name="皮卡丘" #建立一個物件變數 結果 : Pokemon出生了, 等級為100
自訂建構子
在 __init__(self, name, level)加入了區域變數, 就是自訂建構子, 如下代碼
class Pokemon(object): def __init__(self, name, level): self.level=level self.name=name print("%s出生了, 等級為%d" % (self.name, self.level)) s1=Pokemon("Eve", 10) 結果: Eve出生了, 等級為10
建構子重載
Python並不支援方法或建構子重載, 如下代碼, 雖然不會出錯, 但無法調用預設建構子
class Pokemon(object): def __init__(self): self.level=100 level=10 print("Pokemon出生了, 等級為%d" % self.level) def __init__(self, level): self.level=level print("Pokemon出生了, 等級為%d" % self.level) s1=Pokemon(10) #s2=Pokemon() # 此行會出錯, 無法調用預設建構子
建構子重載解決方案
為了解決不能重載的問題, 可以使用預設值的方式, 如下所示
class Pokemon(object): def __init__(self, level=0, w=0): self.level=level print("Pokemon 出生了 : %d" % self.level) p1=Pokemon() p2=Pokemon(20) 結果 : Pokemon 出生了 : 0 Pokemon 出生了 : 20
所以由上可知, 函數或方法因為可以設定預設值, 所以根本就不需要重載的機制