面向对象三大特性之多态

面向对象三大特性之多态

一、什么是多态

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

二、为何要用多态

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

三、多态的三种表现形式

一、继承父类

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

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

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

注意:在python中不会强制限制子类必需要遵循父类的规范,因此出现了抽象类it

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()

二、继承抽象类

一、什么是抽象类

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

二、抽象类的做用

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

三、如何实现抽象类

  1. 父类须要继承abc抽象类,metaclass=abc.ABCMeta扩展

  2. 在父类的方法中须要装饰上,abc.abstractmethodmeta

注意: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()

三、鸭子类型

一、什么是鸭子类型

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

二、为何要有鸭子类型

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

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

注意:在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)
相关文章
相关标签/搜索