python面向對象中的__init__方法怎么理解?


我們在學習python類的時候,總會碰見書上的類中有__init__()這樣一個函數,很多同學百思不得其解,其實它就是python的構造方法。

構造方法類似於類似init()這種初始化方法,來初始化新創建對象的狀態,在一個對象唄創建以后會立即調用,比如像實例化一個類:

f = FooBar()
f.init()

使用構造方法就能讓它簡化成如下形式:

f = FooBar()

你可能還沒理解到底什么是構造方法,什么是初始化,下面我們再來舉個例子:

class FooBar:

def __init__(self):

self.somevar = 42

 

>>>f = FooBar()

>>>f.somevar

42

 

我們會發現在初始化FooBar中的somevar的值為42之后,實例化直接就能夠調用somevar的值;如果說你沒有用構造方法初始化值得話,就不能夠調用,明白了嗎?

 

在明白了構造方法之后,我們來點進階的問題,那就是構造方法中的初始值無法繼承的問題。

例子:

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

原理:它會查找所有的超類,以及超類的超類,直到找到所需的特性為止。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM