在python學(xué)習(xí)中,往往你會看到有的名稱前面和后面都加上了雙下劃線,這種寫法很特別,到底是什么意思呢?
在python 中由這些名字組成的集合所包含的方法就叫做魔法方法,也叫做特殊方法。今天我們就要講一些重要的魔法方法,最重要的就是__init__方法。
當(dāng)一個對象被創(chuàng)建以后,會立即調(diào)用構(gòu)造方法。
創(chuàng)建構(gòu)造方法:在python中創(chuàng)建一個構(gòu)造方法很簡單,只要把init方法的名字從簡單的init修改為魔法版本__init__即可。
一個例子學(xué)會所有內(nèi)容。
代碼講解:定義了一個超類Bird,一個子類SongBird, 超類Bird定義了構(gòu)造方法__init__是關(guān)于hungry特性的。在定義子類的時候構(gòu)造方法被重寫,但是新的構(gòu)造方法沒有任何關(guān)于hungry特性的代碼。為了達(dá)到目的就得必須調(diào)用超類的構(gòu)造方法。
def __init__(self):
self.hungry=True
def eat(self):
if self.hungry:
print ''Aaaah...''
self.hungry=False
else:
print ''No,thanks!''
class SongBird(Bird):
self.sound=''Squawk!''
def sing(self):
print self.sound
>>> b=Bird()
>>> sb=SongBird()
>>> sb.sing()
>>> sb.eat()
Traceback (most recent call last):
File '<pyshell#5>', line 1, in <module>
File 'C:\Users\xdong\OneDrive - Micron Technology, Inc\python study\prictice\bird_hungry.py', line 6, in eat
AttributeError: ''SongBird'' object has no attribute ''hungry''
相信看了上個例子的小伙伴開始有疑問了,方法重寫后,我應(yīng)該怎么調(diào)用超類的構(gòu)造方法呢?
我們現(xiàn)在要說兩種情況教你怎么調(diào)用,說這個問題之前,我們先插點(diǎn)題外話,與其說是題外話倒不如說是知識擴(kuò)展,我們先了解一下老式類和新式類的區(qū)別,這個需要看你的python的安裝版本是多少,現(xiàn)在大部分都是3.0以上版本了,那么早在之前,以2.2版本為分割線,之前的版本是用的老師類,之后的用新式類。所以根據(jù)目前的發(fā)展情況,建議大家都用新式類,省的麻煩。
好了,話不多說,回歸正題,我們就用老式類和新式類分別講一下怎么可以直接調(diào)用上個例子中的超類Bird的構(gòu)造方法。
我們先說一下原理,方便你理解。
在調(diào)用一個實(shí)例的方法時,該方法的self參數(shù)會被自動綁定到實(shí)例上,但是如果直接調(diào)用類的方法,那么就沒有實(shí)例會被綁定,這樣就可以自由地提供需要的self參數(shù)。其實(shí)這樣子也被稱為未綁定方法。
上例中,通過將當(dāng)前的實(shí)例作為self參數(shù)提供給未綁定方法,SongBird就能夠使用其他超類構(gòu)造方法的所有實(shí)現(xiàn),也就是說屬性hungry能被設(shè)置。
一般情況下,調(diào)用超類的未綁定方法才是版本最好的選擇。
既然說到這了,相信眼睛犀利的小伙伴們開始疑問了,那個super是什么東東?別著急,慢慢來!
super函數(shù):主要是應(yīng)用在新式類。
序列和映射是對象的集合。為了實(shí)現(xiàn)它們基本行為,如果對象是不變的,那么久需要兩個魔法方法,如果可變的就需要4個。
如果創(chuàng)建一個無窮序列會發(fā)生什么?先上代碼。
代碼解釋: start=1,step=2 會得到(1,3,5,7,9,11......)
self.start key*self.step s[4]=1 4*2=9 s[5]=1 5*2=11