类的多态

多态是面向对象的又一重要概念,字面意义就是“多种状态”。在程序中不需要区分引用对象,用相同的调用方法,完成引用对象的功能而表现出多种状态。有了多态,就不需要为每个具体的子类编写功能调用,是一种泛型编程。如果你是一个公司的后勤经理,需要打扫地面,不论是扫地机器人还是清洁工,你只要告诉他打扫的范围,他们就可以完成打扫的任务。
在一些语言中需要使用继承、接口、不同参数方法来实现多态。由于Python是动态语言,其实现的基本方式称为“鸭子类型”(duck typing)。即"当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。"在Python的调用语义中,只要调用对象具有所调用的属性,那么不管调用对象是什么类型,就可以调用成功。
在维基百科的词条(https://en.wikipedia.org/wiki/Duck_typing)中示例代码如下:

class Duck:
    def fly(self):
        print("Duck flying")

class Airplane:
    def fly(self):
        print("Airplane flying")

class Whale:
    def swim(self):
        print("Whale swimming")

def lift_off(entity):
    entity.fly()

duck = Duck()
airplane = Airplane()
whale = Whale()

lift_off(duck) # prints `Duck flying`
lift_off(airplane) # prints `Airplane flying`
lift_off(whale) # Throws the error `'Whale' object has no attribute 'fly'`

在函数lift_off()中对传入的entity调用了fly()方法,传入函数的是什么对象类型,只要entity引用的对象包括fly()方法,就可以成功调用,如lift_off(duck)、lift_off(airplane)。而第三次调用时,即lift_off(whale),传入的是Whale类的实例,其不具有fly()属性,因此调用就会失败。
正是因为Python的这种特性,降低了Python实现多态的难度,提高了多态实现的灵活性。所以在一些Python的面向对象程序资料中,对多态的介绍仅限于此。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • # 第一优先级规则声明: # 除了梦境,每一个意识主进程都必须与一个身体参与的机械进程相匹配,否则结束意识主进程。...
    李洞BarryLi阅读 3,929评论 0 1
  • 1/579文件IO文件介绍I/O流流的概念读写文件文件备份IO介绍大家应该听说过一句话:“好记性不如烂笔头”。不仅...
    清清子衿木子水心阅读 1,480评论 0 1
  • python与鸭子类型 调用不同的子类将会产生不同的行为,而无须明确知道这个子类实际上是什么,这是多态的重要应用场...
    JasonDing阅读 8,629评论 0 15