建構子Constructor

      在〈建構子Constructor〉中尚無留言

建構子(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

所以由上可知, 函數或方法因為可以設定預設值, 所以根本就不需要重載的機制

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *