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
# 更进一步,我们可以定义一个统一的接口来使用,实现动态的多态性;