多态是针对同一种行为表现出不同形态的能力。
在不同类中可能会有同一种行为,我们想要调用这个方法时,如果针对每一个类,设置一个单独的函数去调用它,那就太麻烦了。
这时候我们就需要多态,它可以先判断对象属于哪一类,在去对应的类调用相应的函数。
比如我们有许多种动物:牛马鸟蛇狗猪,每一种动物是一类,每一类我们要存储他们吃什么这一信息。使用多态就可以根据实例对象是那一类,再到相应类调用函数
"""Animal类的创建"""
class Animal():
def food(self):
print('Animals eat food.')
"""Dog类的创建,Dog是Animal类的子类"""
class Dog(Animal):
def food(self):
print('Dogs eat meat.')
"""Rabbit类的创建,Rabbit是Animal类的子类"""
class Rabbit(Animal):
def food(self):
print('Rabbits eat grass.')
"""People类的创建"""
class People():
def food(self):
print('People nearly eat everything.')
"""在所有类之外定义函数能够调用一个对象的food()方法"""
def fun(obj):
obj.food()
"""调用函数,其中Animal()这个格式是创建一个类的实例对象"""
fun(Animal())
fun(Dog())
fun(Rabbit())
"""People类和其他类并不存在继承关系,但People类有food方法,所以它也会调用food方法"""
fun(People())
结果为:
Animals eat food.
Dogs eat meat.
Rabbits eat grass.
People nearly eat everything.
静态语言和动态语言实现多态的区别
静态语言实现多态的必要条件:继承、方法重写、父类引用指向子类对象
动态语言的多态崇尚"鸭子类型"
鸭子类型的含义:
一只鸟走起来像鸭子、游起泳来像鸭子、叫起来也像鸭子,那它就可以被当做鸭子。也就是说,它不关注对象的类型,而是关注对象具有的行为(方法)。
在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。
例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭的对象,并调用它的走和叫方法。
在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。任何拥有这样的正确的走和叫方法的对象都可被函数接受。