很多人喜欢将多态与多态性二者混为一谈,然后百思不得其解,其实只要分开看,就会很明朗。
一、多态
多态指的是一类事物有多种形态。(一个抽象类有多个子类,因而多态的概念依赖于继承)
比如动物有多种形态:人、狗、猪
class Animal(object): def talk(self): raise AttributeError('子类必须实现这个方法') 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') peo1 = People() pig1 = Pig() d1 = Dog() peo1.talk() pig1.talk() d1.talk()
二、多态性
多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以在调用一个函数名的情况下,实现不同的功能。
在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。
也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。
class Animal(object): def talk(self): raise AttributeError('子类必须实现这个方法') 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') def animalTalk(obj): obj.talk() peo = People() pig = Pig() dog = Dog() # 向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为 animalTalk(peo) animalTalk(pig) animalTalk(dog)
三、为什么要用多态性(多态性的好处)
(1)增加了程序的灵活性
以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如animalTalk(obj)
(2)增加了程序额可扩展性
通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用animalTalk(obj)去调用
再次提醒:多态与多态性不要混为一谈!
多态:同一种事物的多种形态,动物分为人类,猪类(在定义角度)
多态性:一种调用方式,不同的执行效果(多态性)