百科狗-知识改变命运!
--

python 中的多态

是丫丫呀12个月前 (11-21)阅读数 15#技术干货
文章标签类型

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培训机构:开发教育。

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)