python中的鴨子類型允許我們使用任何提供所需方法的對象,而不需要迫使它成為一個(gè)子類。
由于python屬于動(dòng)態(tài)語言,當(dāng)你定義了一個(gè)基類和基類中的方法,并編寫幾個(gè)繼承該基類的子類時(shí),由于python在定義變量時(shí)不指定變量的類型,而是由解釋器根據(jù)變量內(nèi)容推斷變量類型的(也就是說變量的類型取決于所關(guān)聯(lián)的對象),這就使得python的多態(tài)不像是c++或java中那樣,定義一個(gè)基類類型變量而隱藏了具體子類的細(xì)節(jié)。
請看下面的例子和說明:
1classAudioFile:
2def__init__(self,filename):
3ifnotfilename.endswith(self.ext):
4raiseException("Invalidfileformat")
5self.filename=filename
6
7classMP3File(AudioFile):
8ext="mp3"
9defplay(self):
10print("Playing{}asmp3".format(self.filename))
11
12classWavFile(AudioFile):
13ext="wav"
14defplay(self):
15print("Playing{}aswav".format(self.filename))
16
17classOggFile(AudioFile):
18ext="ogg"
19defplay(self):
20print("Playing{}asogg".format(self.filename))
21
22classFlacFile:
23"""
24ThoughFlacFileclassdoesn'tinheritAudioFileclass,
25italsohasthesameinterfaceasthreesubclassofAudioFile.
26
27Itiscalledducktyping.
28"""
29def__init__(self,filename):
30ifnotfilename.endswith(".flac"):
31raiseException("Invalidfileformat")
32self.filename=filename
33
34defplay(self):
35print("Playing{}asflac".format(self.filename))
上面的代碼中,MP3File、WavFile、OggFile三個(gè)類型繼承了AudioFile這一基類,而FlacFile沒有擴(kuò)展AudioFile,但是可以在python中使用完全相同的接口與之交互。
因?yàn)槿魏翁峁┱_接口的對象都可以在python中交替使用,它減少了多態(tài)的一般超類的需求。繼承仍然可以用來共享代碼,但是如果所有被共享的都是公共接口,鴨子類型就是所有所需的。這減少了繼承的需要,同時(shí)也減少了多重繼承的需要;通常,當(dāng)多重繼承似乎是一個(gè)有效方案的時(shí)候,我們只需要使用鴨子類型去模擬多個(gè)超類之一(定義和那個(gè)超類一樣的接口和實(shí)現(xiàn))就可以了。
以上內(nèi)容為大家介紹了python中的多態(tài),希望對大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。