python 中的多态
python中的鸭子类型允许我们使用任何提供所需方法的对象,而不需要迫使它成为一个子类。
由于python属于动态语言,当你定义了一个基类和基类中的方法,并编写几个继承该基类的子类时,由于python在定义变量时不指定变量的类型,而是由解释器根据变量内容推断变量类型的(也就是说变量的类型取决于所关联的对象),这就使得python的多态不像是c++或java中那样,定义一个基类类型变量而隐藏了具体子类的细节。
请看下面的例子和说明:
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中交替使用,它减少了多态的一般超类的需求。继承仍然可以用来共享代码,但是如果所有被共享的都是公共接口,鸭子类型就是所有所需的。这减少了继承的需要,同时也减少了多重继承的需要;通常,当多重继承似乎是一个有效方案的时候,我们只需要使用鸭子类型去模拟多个超类之一(定义和那个超类一样的接口和实现)就可以了。
以上内容为大家介绍了python中的多态,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:千锋教育。
相关推荐HOT
更多>>pythonprint函数如何不换行
python3.0的print函数有如下的形式:print([object,...][,seq=''][,end='\n'][,file=sys.stdout])我们在...详情>>
2023-11-09 19:52:59转java还是python?
从目前IT行业的人才需求上来看,如果是应用级开发,那么掌握Java语言会更容易实现就业,因为在目前的生产环境下,Java语言凭借其健全的语言生态...详情>>
2023-11-09 18:02:00python中怎么对一个数进行因式分解?
1、Python因式分解代码:importtime#对一个数进行因式分解deffactorization(num):factor=[]whilenum>1:foriinrange(num-1):k=i...详情>>
2023-11-09 12:01:26python如何让程序暂停执行和继续执行?
python让程序继续执行的方法:一、使用到的函数或库1.cv2.imshow()2.cv2.waitKey()3.time.sleep()4.cv2.putText()5.np.zeros()二、程详情>>
2023-11-09 11:03:08