python中的鴨子類型允許我們使用任何提供所需方法的對象,而不需要迫使它成為一個子類。
由于python屬于動態(tài)語言,當(dāng)你定義了一個基類和基類中的方法,并編寫幾個繼承該基類的子類時,由于python在定義變量時不指定變量的類型,而是由解釋器根據(jù)變量內(nèi)容推斷變量類型的(也就是說變量的類型取決于所關(guān)聯(lián)的對象),這就使得python的多態(tài)不像是c++或java中那樣,定義一個基類類型變量而隱藏了具體子類的細(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三個類型繼承了AudioFile這一基類,而FlacFile沒有擴展AudioFile,但是可以在python中使用完全相同的接口與之交互。
因為任何提供正確接口的對象都可以在python中交替使用,它減少了多態(tài)的一般超類的需求。繼承仍然可以用來共享代碼,但是如果所有被共享的都是公共接口,鴨子類型就是所有所需的。這減少了繼承的需要,同時也減少了多重繼承的需要;通常,當(dāng)多重繼承似乎是一個有效方案的時候,我們只需要使用鴨子類型去模擬多個超類之一(定義和那個超類一樣的接口和實現(xiàn))就可以了。
以上內(nèi)容為大家介紹了python中的多態(tài),希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機構(gòu):千鋒教育。