今天我们要讲一讲面向对象的第三个特性:多态;
什么叫做多态?从字面意思上理解,就是一个函数具有多种形态。本质上其实就是同一操作方法作用于不同的对象时,有着不同的解释,执行不同的逻辑,产生不同的结果。今天我们还是用例子来说明在Python中多态的使用方法、注意事项和使用的优点。
多态
你还是这家快要上市的快递公司的老板,你手底下的部门有很多个了,其中有两个重要的部门,一个叫做“海运部门”,可以定义成一个“海运部门类”,专门负责海上的物流快递运输,一个叫做“空运部门”,可以定义成一个“空运部门类”,专门负责航空的物流快递运输。这两个类是“部门类”的子类,下面我们用代码来表示一下这三个类:
在上例中,我们定义了三个类,主类叫做“部门类”,两个子类继承于该类,分别代表“海运部门”和“空运部门”,这两个类除了都有自己的构造函数之外,还有着一个具有相同名称的方法,我们暂且叫做“送货”方法。这两个类实例化对象后,都调用各自的“送货”方法后,我们看到,输出的结果是不一样的,也就是说,它们分别执行了各自类中的方法。
像上例中,不同的对象(海运部门和空运部门)虽然执行的方法(送货)是同一个,但是执行的结果是不一样的,在面向对象的程序设计中,通过相同的函数方法名去执行不同的动作,可以得到不同的结果,这样的程序设计方法就叫做多态;
多态的思想其实是一类事物具有多种形态,就像上例,“部门类”具有多种形态,分别是“海运部门”和“空运部门”。多态是与继承结合在一起的,因此多态的概念依赖于继承。
注意:
学习过Python的朋友都知道,Python中的变量是弱类型的,也就是说,在定义时是不用指明该变量的类型,在运行时才确定其状态。这点和Java、C++的区别很大,所以,有些人也称Python是一种多态语言。最明显的例子就是我们经常在用的一个函数:“len(object)”,这个python的内置函数不仅可以计算字符的长度,而且可以计算列表、元组等其他类型的数据个数,这正是多态的一种体现。
多态性
初学的时候经常容易把多态和多态性这两个概念搞混淆,有时候面试的时候也会问到这个问题。如果说多态是一类事物具有多种形态的话,那多态性就是不同类型的实例具有相同的调用方法,我们用下面的例子来说明:
定义一个统一的接口:“func(c,peoplenum)”,调用时参数直接填入实例化的对象,可以直接调用该类的方法(一个接口,多种实现)。
使用多态的好处
增加程序的灵活性
调用者不管类里面的方法是通过什么逻辑实现,都只管使用一种方法去调用;
增加程序的可扩展性
即便在“部门类”里再扩展其他的子类,调用者也不需要更改代码,还是使用“func(c,peoplenum)”来调用;