面向对象三大特性之多态

面向对象三大特性之多态

1、什么是多态

多态指的是同一类事物有多种不同的形态

2、为什么要用多态

多态也称为多态性,目的是为了 在不知道对象具体类型的情况下,统一对象的调用方法的规范

3、多态的三种表现形式

1、继承父类

耦合度高,程序可扩展性低

父类:定制一套统一的规范(比如方法名统一)

子类:遵循父类的统一规范(比如子类要遵循父类方法名统一)

注意:在python中不会强制限制子类必须要遵循父类的规范,所以出现了抽象类

class Animal:
    def speak(self):
        pass
    def eat(self):
        pass

class Dog(Animal):
    def speak(self):  # 遵循父类的speak
        print('汪汪汪~')
    def eat(self):  # 遵循父类的eat
        print('舔狗~')

class Pig(Animal):
    def speak(self):  # 遵循父类的speak
        print('哼哼哼~')
    def eat(self):  # 遵循父类的eat
        print('嗯嗯嗯~')
# 统一了对象的调用方式
dog_obj = Dog()
pig_obj = Pig()
dog_obj.speak()
pig_obj.speak()
dog_obj.eat()
pig_obj.eat()

2、继承抽象类

1、什么是抽象类

在python内置的abc模块中有一个抽象类

2、抽象类的作用

让子类必须遵循父类的编写规范

3、如何实现抽象类

  1. 父类需要继承abc抽象类,metaclass=abc.ABCMeta

  2. 在父类的方法中需要装饰上,abc.abstractmethod

注意:python中不推荐使用抽象类,因为耦合度极高,可扩展性极低

子类必须按照父类的方法编写规范,缺一不可,只要父类中有多少个,子类中都要定义上

import abc

class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def speak(self):
        pass
    @abc.abstractmethod
    def eat(self):
        pass
    
class Dog(Animal):
    def speak(self):  # 遵循父类的speak
        print('汪汪汪~')
    def eat(self):  # 遵循父类的eat
        print('舔狗~')

 class Pig(Animal):
     def speak(self):  # 遵循父类的speak
         print('哼哼哼~')
     def chi(self):  # 未遵循父类的eat,则会报错TypeError: Can't instantiate abstract class Pig with abstract methods eat
         print('嗯嗯嗯~')

class Cat(Animal):
    def speak(self):
        print('喵喵喵~')
    # 缺少一个父类定义的规范会报错
    # TypeError: Can't instantiate abstract class Cat with abstract methods eat

dog_obj = Dog()
# pig_obj = Pig()
dog_obj.speak()
# pig_obj.speak()
dog_obj.eat()
# pig_obj.chi()
cat_obj = Cat()

3、鸭子类型

1、什么是鸭子类型

不同的对象,只要长得像鸭子,那它就是鸭子

2、为什么要有鸭子类型

耦合度低,程序可扩展性强

不同的对象,先抽象出相同类型的方法,给他们定制一套统一 规范,所有的类,在定义时都按照统一的规范进行编写

注意:在python中推荐使用鸭子类型

# 抽象统一定制出一套规范,speak,eat
# 猪类
class Pig:
    def eat(self):
        print('bia唧...')

    def speak(self):
        print('哼哼哼...')


# 猫类
class Cat:
    def eat(self):
        print('咬ji 咬ji....')

    def speak(self):
        print('喵喵喵...')


# 狗类
class Dog:
    def eat(self):
        print('舔狗...')

    def speak(self):
        print('汪汪汪...')
# 因为都有speak和eat 所以可以定义一个speak和eat函数可以直接调用
dog = Dog()
pig = Pig()

def SPEAK(animal):
    animal.speak()

def EAT(animal):
    animal.eat()

SPEAK(pig)
EAT(dog)
posted @ 2019-11-28 21:34  Mr沈  阅读(851)  评论(0编辑  收藏  举报