python 中的多态

发布时间:2022-05-11 09:59:35 人气:29 作者:多测师

  python中的鸭子类型允许我们使用任何提供所需方法的对象,而不需要迫使它成为一个子类。

  由于python属于动态语言,当你定义了一个基类和基类中的方法,并编写几个继承该基类的子类时,由于python在定义变量时不指定变量的类型,而是由解释器根据变量内容推断变量类型的(也就是说变量的类型取决于所关联的对象),这就使得python的多态不像是c++或java中那样,定义一个基类类型变量而隐藏了具体子类的细节。

  请看下面的例子和说明:

python 中的多态

  1 class AudioFile:

  2 def __init__(self, filename):

  3 if not filename.endswith(self.ext):

  4 raise Exception("Invalid file format")

  5 self.filename = filename

  6

  7 class MP3File(AudioFile):

  8 ext = "mp3"

  9 def play(self):

  10 print("Playing {} as mp3".format(self.filename))

  11

  12 class WavFile(AudioFile):

  13 ext = "wav"

  14 def play(self):

  15 print("Playing {} as wav".format(self.filename))

  16

  17 class OggFile(AudioFile):

  18 ext = "ogg"

  19 def play(self):

  20 print("Playing {} as ogg".format(self.filename))

  21

  22 class FlacFile:

  23 """

  24 Though FlacFile class doesn't inherit AudioFile class,

  25 it also has the same interface as three subclass of AudioFile.

  26

  27 It is called duck typing.

  28 """

  29 def __init__(self, filename):

  30 if not filename.endswith(".flac"):

  31 raise Exception("Invalid file format")

  32 self.filename = filename

  33

  34 def play(self):

  35 print("Playing {} as flac".format(self.filename))

  上面的代码中,MP3File、WavFile、OggFile三个类型继承了AudioFile这一基类,而FlacFile没有扩展AudioFile,但是可以在python中使用完全相同的接口与之交互。

  因为任何提供正确接口的对象都可以在python中交替使用,它减少了多态的一般超类的需求。继承仍然可以用来共享代码,但是如果所有被共享的都是公共接口,鸭子类型就是所有所需的。这减少了继承的需要,同时也减少了多重继承的需要;通常,当多重继承似乎是一个有效方案的时候,我们只需要使用鸭子类型去模拟多个超类之一(定义和那个超类一样的接口和实现)就可以了。

  以上内容为大家介绍了python 中的多态,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注多测师。https://www.e70w.com/xwzx/


返回列表
在线客服
联系方式

热线电话

17727591462

上班时间

周一到周五

二维码
线