20、面向对象(多态)


20.1、多态介绍:

1、什么是多态:

多态指的是一类事物的多种形态,比如动物有多种形态:人、狗、猪;

在python中接口可以比作是一类事物、继承接口的子类可以比作为多种形态(不同子类下具有相同的方法);

实现方式(接口+继承):多态和继承一起使用,继承常使用接口(特殊的抽象类)的方式实现;


2、多态的动态性:

(1)在一个函数中传入不同类的对象,在该函数内不同类的对象去调用自己类下相同的方法;

(2)比如:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生执行的是放学操作,虽然二者消息一样,

但是执行的效果不同。

(3)使用多态的动态性的好处:

1)增加了程序的灵活性:

以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(obj)

2)增加了程序可扩展性:

通过继承类创建了一个新的类,使用者无需更改自己的代码,还是用func(obj)去调用

(4)其实大家一直在享受着多态性带来的好处,比如 Python 的序列类型有多种形态:字符串,列表,元组,多态性体现如下:

# str,list,tuple都是序列类型

s=str('hello')

l=list([1,2,3])

t=tuple((4,5,6))


# 我们可以在不考虑三者类型的前提下使用s,l,t

s.__len__()

l.__len__()

t.__len__()


len(s)

len(l)

len(t)


20.2、示例:

import abc

class Animal(metaclass=abc.ABCMeta):

@abc.abstractmethod

def talk(self):

pass

# 同一类事物:动物(接口,特殊的抽象类)


class People(Animal):

def talk(self):

print('say hello')

# 动物的形态之一:人


class Dog(Animal):

def talk(self):

print('say wangwang')

# 动物的形态之二:狗


class Pig(Animal):

def talk(self):

print('say aoao')

# 动物的形态之三:猪


peo=People()

dog=Dog()

pig=Pig()


peo.talk()

dog.talk()

pig.talk()

# peo、dog、pig 都是动物,只要是动物肯定有talk方法

# 于是我们可以不用考虑它们三者的具体是什么类型,而直接使用

# say hello

# say wangwang

# say aoao



def func(obj):

obj.talk()


func(peo)

func(dog)

func(pig)

# say hello

# say wangwang

# say aoao

# 更进一步,我们可以定义一个统一的接口来使用,实现动态的多态性;







原文地址:https://www.cnblogs.com/LiuChang-blog/p/12320477.html