类的“多态”

多态

1)、什么是多态

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

 

2)、多态的目的

  “多态” 也称之为 “多态性”,目的是为了 在不知道对象具体类型的情况下,统一对象调用方法的规范(比如:名字)

 

3)、多态的三种表现形式

  ① 继承父类

  ② 继承抽象类

  ③ 鸭子类型

 

 

1、继承父类

  多态的表现 “形式之一” 就是 继承父类

 

  如何实现:

    - 先抽象(即总结子类和父类的相同属性及方法),再继承

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

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

 

# 动物类
class Animal:

    def eat(self):
        pass

    def speak(self):
        pass


# 猪类
class Pig(Animal):
    def eat(self):
        print("bia叽...")

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

# 猫类
class Cat(Animal):
    def eat(self):
        print("咬叽...")

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

# 狗类
class Dog(Animal):
    def eat(self):
        print("舔叽...")

    def speak(self):
        print("汪汪汪...")


animal1 = Pig()
animal2 = Cat()
animal3 = Dog()

animal1.speak()
animal2.speak()
animal3.speak()

  执行结果:

哼哼哼...
喵喵喵...
汪汪汪...


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

 

 

2、继承抽象类

1)什么是抽象类

  在python内置的abc模块中,有一个抽象类,使用此类,使子类必须遵循父类的编码规范(不遵循,调用即报错)

 

2)抽象类的作用

  只要父类继承了抽象类,子类就必须遵循父类的编码规范

 

3)如何实现抽象类

  父类需要继承abc模块中:metaclass=abc.ABCMeta

  在父类的需要遵循编码规范的方法上装饰上abc.abstractmethod

 

注意:子类必须要按照父类的方法编写规范,缺一不可。(只要父类中有几个抽象方法,子类就要有几个抽象方法)

 

  例:写一个抽象类

import abc

# 父类需要继承abc模块中:metaclass=abc.ABCMeta
class Animal(metaclass=abc.ABCMeta):
    # 在父类的需要遵循编码规范的方法上装饰上abc.abstractmethod
    @abc.abstractmethod
    def eat(self):
        pass
    # 在父类的需要遵循编码规范的方法上装饰上abc.abstractmethod
    @abc.abstractmethod
    def speak(self):
        pass

# 猪类
class Pig(Animal):
    # 根据父类编码规范必须要有eat方法(方法名不能变)
    def eat(self):
        print("bia叽...")
    # 根据父类编码规范必须要有speak方法(方法名不能变)
    def speak(self):
        print("哼哼哼...")
    # 此方法无要求,可有可无
    def run(self):
        print("pig is running...")

pig_obj = Pig()

 

 

3、鸭子类型

1)什么是鸭子类型

  不同的对象,只要长得像鸭子,动物行为像鸭子,那就是鸭子!

  “鸭子类型” 是多态的表现形式之一

 

  PS:多态(继承父类、继承抽象类、鸭子类型)其实就是代码的规范形式,即编码规范

 

2)如何实现鸭子类型

  不同对象,先抽象出相同类型的方法,给他们定制一套统一的规范

  所有的类,在定义时都按照统一的规范进行编写

 

注意:在python中,强烈推荐鸭子类型

 

# 动物类:定义代码规范
class Animal:
    def eat(self):
        pass

    def speak(self):
        pass

# 猪类:按照动物类的代码规范来编写
class Pig:
    def eat(self):
        print("bia叽...")

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

# 猫类:按照动物类的代码规范来编写
class Cat:
    def eat(self):
        print("咬叽...")

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

# 狗类:按照动物类的代码规范来编写
class Dog:
    def eat(self):
        print("舔叽...")

    def speak(self):
        print("汪汪汪...")

 

 

4、多态总结

  多态的三种表现形式:

    继承父类:

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

    继承抽象类:(强烈不推荐使用)

      耦合度极高,程序的扩展性极低

    鸭子类型:(强烈推荐使用)

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

posted @ 2020-10-27 17:47  Sg、  阅读(38)  评论(2编辑  收藏