|
在python學習中,往往你會看到有的名稱前面和后面都加上了雙下劃線,這種寫法很特別,到底是什么意思呢? 在python 中由這些名字組成的集合所包含的方法就叫做魔法方法,也叫做特殊方法。今天我們就要講一些重要的魔法方法,最重要的就是__init__方法。 當一個對象被創(chuàng)建以后,會立即調用構造方法。 創(chuàng)建構造方法:在python中創(chuàng)建一個構造方法很簡單,只要把init方法的名字從簡單的init修改為魔法版本__init__即可。 ![]() 一個例子學會所有內容。 代碼講解:定義了一個超類Bird,一個子類SongBird, 超類Bird定義了構造方法__init__是關于hungry特性的。在定義子類的時候構造方法被重寫,但是新的構造方法沒有任何關于hungry特性的代碼。為了達到目的就得必須調用超類的構造方法。 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'' 相信看了上個例子的小伙伴開始有疑問了,方法重寫后,我應該怎么調用超類的構造方法呢? 我們現(xiàn)在要說兩種情況教你怎么調用,說這個問題之前,我們先插點題外話,與其說是題外話倒不如說是知識擴展,我們先了解一下老式類和新式類的區(qū)別,這個需要看你的python的安裝版本是多少,現(xiàn)在大部分都是3.0以上版本了,那么早在之前,以2.2版本為分割線,之前的版本是用的老師類,之后的用新式類。所以根據(jù)目前的發(fā)展情況,建議大家都用新式類,省的麻煩。 好了,話不多說,回歸正題,我們就用老式類和新式類分別講一下怎么可以直接調用上個例子中的超類Bird的構造方法。 ![]() 我們先說一下原理,方便你理解。 在調用一個實例的方法時,該方法的self參數(shù)會被自動綁定到實例上,但是如果直接調用類的方法,那么就沒有實例會被綁定,這樣就可以自由地提供需要的self參數(shù)。其實這樣子也被稱為未綁定方法。 上例中,通過將當前的實例作為self參數(shù)提供給未綁定方法,SongBird就能夠使用其他超類構造方法的所有實現(xiàn),也就是說屬性hungry能被設置。 一般情況下,調用超類的未綁定方法才是版本最好的選擇。 既然說到這了,相信眼睛犀利的小伙伴們開始疑問了,那個super是什么東東?別著急,慢慢來! super函數(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 |
|
|