类的多态和多态性

很多人喜欢将多态多态性二者混为一谈,然后百思不得其解,其实只要分开看,就会很明朗。

一、多态

多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承)

  1. 序列数据类型有多种形态:字符串,列表,元组
  2. 动物有多种形态:人,狗,猪
#多态基础
class Animal:
    def speak(self):
        pass
class Pig(Animal):
    def speak(self):	
        print('哼哼哼')

class Dog(Animal):
    def speak(self):	
        print('汪汪')	

class People(Animal):
    def speak(self):	
        print('say hello')

pig=Pig()
dog=Dog()
people=People()
pig.speak()
dog.speak()
people.speak()

二、多态性

注意:多态与多态性是两种概念

多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

pig=Pig()
dog=Dog()
people=People()

# 使用相同函数,实现多态性
def animal_speak(obj):
    obj.speak()
animal_speak(pig)
animal_speak(people)

综上可以说,多态性是一个接口(函数)的多种实现(如obj.speak(),obj.speak(),obj.speak(),len(speak))

三、多态性的好处

其实大家从上面多态性的例子可以看出,我们并没有增加新的知识,也就是说Python本身就是支持多态性的,这么做的好处是什么呢?

  1. 增加了程序的灵活性:以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)
  2. 增加了程序额可扩展性:通过继承Animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用

四、实现接口统一化

实现接口统一化有两种方式,下面分别介绍

4.1 使用abc实现接口统一化(约束代码,用的比较少)

  1. import abc.

  2. 在基类括号中写入,如:class 类名(metaclass=abc.ABCMeta):

  3. 在需要约束的方法前,使用语法糖加入@abc.abstractmethod装饰器

这样当子类继承父类时,必须实现父类约束的方法。否则会报错

import abc
#第一在括号中写metaclass=abc.ABCMeta
class Animal(metaclass=abc.ABCMeta):
    #第二在要约束的方法上,写abc.abstractmethod装饰器
    @abc.abstractmethod
    def speak(self):
        pass

class Pig(Animal):
    def speak(self):	# 不写speak则报错
        print('哼哼哼')
        
def animal_speak(obj):
    obj.speak()
    
pig=Pig()
animal_speak(pig)

哼哼哼

4.2 使用异常处理来实现接口统一化(常用)

通过主动抛出异常的方式来实现接口统一化

#第二种方式,用异常处理来实现(常用)
class Animal():
    def speak(self):
        #主动抛出异常
        raise Exception('你得给我重写它啊')
class Pig(Animal):
    def speak(self):
        print('哼哼哼')
class People(Animal):
    def speak(self):
        print('say hello')
pig=Pig()
pe=People()
def animal_speak(obj):
    obj.speak()

animal_speak(pig)
animal_speak(pe)

哼哼哼
say hello

五、小结

多态:同一种事物的多种形态,动物分为人类,猪类(在定义角度)
多态性:一种调用方式,不同的执行效果(多态性)

posted @ 2019-08-28 17:36  正在学习的Barry  阅读(375)  评论(0编辑  收藏  举报
-->