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

Posted 王大桃zzZ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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())

 

以上是关于python之路之前没搞明白5面向对象(多态)的主要内容,如果未能解决你的问题,请参考以下文章

python之路之前没搞明白4面向对象(封装)

python之路之前没搞明白8面向对象(反射,非常重要)

Python之路-面向对象&继承和多态&类属性和实例属性&类方法和静态方法

Python全栈之路系列----之-----面向对象4接口与抽象,多继承与多态)

Python之路 - 面向对象学习

Python之路:面向对象(进阶)