Python 繼承之構造函數的說明
在 Python 中,如果子類不重寫 __init__,實例化子類時,就會自動調用父類的 __init__:
class Father(object):
def __init__(self, name):
self.name=name
print ( "name: %s" %( self.name) )
def getName(self):
return 'Father ' + self.name
class Son(Father):
def getName(self):
return 'Son '+self.name
if __name__=='__main__':
son=Son('yujx')
print ( son.getName() )
結果爲:
name: yujx
Son yujx
如果重寫了__init__ 時,實例化子類,就不會調用父類已經定義的 __init__:
class Father(object):
def __init__(self, name):
self.name=name
print ( "name: %s" %( self.name) )
def getName(self):
return 'Father ' + self.name
class Son(Father):
def __init__(self, name):
print ( "hi" )
self.name = name
def getName(self):
return 'Son '+self.name
if __name__=='__main__':
son=Son('yujx')
print ( son.getName() )
結果爲:
hi
Son yujx
因此如果在子類中需要父類的構造方法就需要顯式地調用父類的構造方法,或者不重寫父類的構造方法,那麼如果顯示的調用父類的構造方法呢?接下來就帶大家學習一下 super 關鍵字的使用。
Super() 函數
super() 函數是用於調用父類(超類)的一個方法。
super 是用來解決多重繼承問題的,直接用類名調用父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查找順序(MRO)、重複調用(鑽石繼承)等種種問題。
MRO 就是類的方法解析順序表, 其實也就是繼承父類方法時的順序表。
語法:
super(type[, object-or-type])
- type – 類;
- object-or-type – 類,一般是 self。
Python3.x 和 Python2.x 的一個區別是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx :
# Python3.x 實例
class A:
def add(self, x):
y = x+1
print(y)
class B(A):
def add(self, x):
super().add(x)
b = B()
b.add(2) # 3
# Python2.x 實例
class A(object): # Python2.x 記得繼承 object
def add(self, x):
y = x+1
print(y)
class B(A):
def add(self, x):
super(B, self).add(x)
b = B()
b.add(2) # 3