小猿圈python学习-三大特性之多态

多态概念

有时一个对象会有多种表现形式,比如网站页面有个button按钮, 这个button的设计可以不一样(单选框、多选框、圆角的点击按钮、直角的点击按钮等),尽管长的不一样,但它们都有一个共同调用方式,就是onClick()方法。我们直要在页面上一点击就会触发这个方法。点完后有的按钮会变成选中状态、有的会提交表单、有的甚至会弹窗。这种多个对象共用同一个接口,又表现的形态不一样的现象,就叫做多态( Polymorphism )。

Polymorphism is based on the greek words Poly (many) and morphism (forms). 接下来我们通过代码来演示什么是多态

通过统一函数接口实现多态

class Dog(object):

    def sound(self):

        print("汪汪汪.....")

class Cat(object):

    def sound(self):

        print("喵喵喵.....")

def make_sound(animal_type):

    """统一调用接口"""

    animal_type.sound() # 不管你传进来是什么动物,我都调用sound()方法

dogObj = Dog()

catObj = Cat()

make_sound(dogObj) 

make_sound(catObj)

通过抽象类实现多态(最常用)

假如你开发一个文本编辑器,支持多种文档类型, 在用户通过你的编辑器打开文件之前,你也不知道准备要打开的是什么类型的文件,可能是pdf,也可能是word.

假如你为每个文件类型都写一个类,每个类都通过show()方法来调用打开对应的文档,为了确保每个类都必须实现show()方法,你可以写一个抽象类。

class Document:

    def __init__(self, name):

        self.name = name

    def show(self):

        raise NotImplementedError("Subclass must implement abstract method")

class Pdf(Document):

    def show(self):

        return 'Show pdf contents!'

class Word(Document):

    def show(self):

        return 'Show word contents!'

documents = [Pdf('Document1'),

            Pdf('Document2'),

            Word('Document3')]

for document in documents:

    print(document.name + ': ' + document.show())

抽象类多态例子2

class Car:

    def __init__(self, name):

        self.name = name

    def drive(self):

        raise NotImplementedError("Subclass must implement abstract method")

    def stop(self):

        raise NotImplementedError("Subclass must implement abstract method")

class SportsCar(Car):

    def drive(self):

        return 'Sportscar driving!'

    def stop(self):

        return 'Sportscar braking!'

class Truck(Car):

    def drive(self):

        return 'Truck driving slowly because heavily loaded.'

    def stop(self):

        return 'Truck braking!'

cars = [Truck('东风重卡'),

        Truck('三一重工'),

        SportsCar('Tesla Roadster')]

for car in cars:

    print(car.name + ': ' + car.drive())

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

推荐阅读更多精彩内容

  • 参考文献: 《大话设计模式》——吴强 《Python设计模式》——pythontip.com 《23种设计模式》—...
    梁林張斌阅读 6,791评论 0 4
  • 面向对象的继承 比较官方的说法就是: 继承(英语:inheritance)是面向对象软件技术当中的一个概念。如果一...
    小猿圈IT教育阅读 3,715评论 0 1
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 8,124评论 0 9
  • 1.1面向对象 面向对象(object-oriented ;简称: OO)至今还没有统一的概念 我这里把它定义为:...
    TENG书阅读 3,624评论 0 0
  • property、魔法属性和魔法方法、多重继承和多继承 1.5 property 学习目标 1. 能够说出什么要...
    Cestine阅读 4,204评论 0 1