python中如果子類沒有構造方法,就會調用父類構造方法初始化子類對象,但是如果子類有自己的構造方法,那麼初始化子類對象的時候只會調用自己的構造方法,不會調用父類構造方法,所以這時父類的屬性不能被直接繼承(方法可以繼承)
在明白了構造方法之後,我們來點進階的問題,那就是構造方法中的初始值無法繼承的問題。
例子:
複製代碼
class Bird:
def __init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print 'Ahahahah'
else:
print 'No thanks!'
class SongBird(Bird):
def __init__(self):
self.sound = 'Squawk'
def sing(self):
print self.song()
sb = SongBird()
sb.sing() #能正常輸出
sb.eat() #報錯,因爲songgird中沒有hungry特性
複製代碼
那解決這個問題的辦法有兩種:
1、調用未綁定的超類構造方法(多用於舊版python陣營)
複製代碼
class SongBird(Bird):
def __init__(self):
Bird.__init__(self)
self.sound = 'Squawk'
def sing(self):
print self.song()
複製代碼
原理:在調用了一個實例的方法時,該方法的self參數會自動綁定到實例上(稱爲綁定方法);如果直接調用類的方法(比如Bird.init),那麼就沒有實例會被綁定,可以自由提供需要的self參數(未綁定方法)。
2、使用super函數(只在新式類中有用)
複製代碼
class SongBird(Bird):
def __init__(self):
super(SongBird,self).__init__()
self.sound = 'Squawk'
def sing(self):
print self.song()
複製代碼
原理:它會查找所有的超類,以及超類的超類,直到找到所需的特性爲止。