• 【python之路】【之前没搞明白】5面向对象(多态)


    多态

    有时一个对象会有多种表现形式,比如网站页面有个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):#重写show() return 'Show pdf contents!'
    class Word(Document): def show(self):#重写show() return 'Show word contents!'
    documents
    = [Pdf('Document1'), Pdf('Document2'), Word('Document3')] for document in documents: print(document.name + ': ' + document.show())

    再来一个例子:

    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())
  • 相关阅读:
    Trie树详解及其应用
    最长回文字符串_Manacher算法_(O(n))
    设置VisualStudio以管理员身份运行
    wcf使用JetEntityFrameworkProvider.dll写access数据库时,报"操作必须使用一个可更新的查询"错误的解决办法
    data:image字符转byte[]
    ID为XXXX的进程当前未运行
    在Windows2003 server 64位系统上使用ArcEngine开发的WCF服务
    关于position的relative和absolute分别是相对于谁进行定位的
    sql语句进行写数据库时,字符串含有'的处理方式
    EF中关于日期字值的处理
  • 原文地址:https://www.cnblogs.com/watalo/p/12327079.html
Copyright © 2020-2023  润新知