我們在學習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()
原理:它會查找所有的超類,以及超類的超類,直到找到所需的特性為止。