python第五天

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()

複製代碼
原理:它會查找所有的超類,以及超類的超類,直到找到所需的特性爲止。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章