面向对象5--多态
1>多态
一类事物有多种形态,比如动物的多种形态:人,狗,猫,他们都是动物类,却是不同的形态,
2>多态性
多态性是指在不考虑实例类型的情况下使用实例,多态性分为静态多态性和动态多态性
静态多态性:如任何类型都可以用运算符+进行运算
动态多态性:如上面的例子,Animal类有say方法,People和Dog都继承了抽象类Animal类,那么People和Dog
肯定都有say方法,所以使用say方法时,根本不必考虑调用者(对象)的类型,不管是People还是Dog,或者其他继承
了Animal的类,都直接调say就是。
至此,多态性的好处也就不言而喻了,对于func1函数而言,它只需要接收Animal类型的就好了,People,Dog或者
都是其他Animal类或者子类,这些类型肯定都有say方法,传入这些任意类型的对象,都会自动调用实际类型的say方法。
2.2>多态性与可扩展性
如下,通过继承animal类创建了一个新的类:猫类,使用者无需更改自己的代码,还是跟之前(调用人的say,调用
狗的say)一样,实例出一只猫,用func(obj)去调用就行。
3>鸭子类型
对于静态语言(例如Java)来说,func1(obj)需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用say()方法。
对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个say()方法就可以了,
-----这就是鸭子类型,他并不要求严格的继承体系,这个传入的对象只要“长得像鸭子,走路像鸭子”,那他就可以被看做鸭子
这里就是对象有say这个方法,那么它就可以作为obj传给func1,去调用say方法。
其他如 len(obj)的例子,obj可以是list,可以是tuple,可以是str等等,list和tuple和str三个类型本身是没什么关联的,
但是他们都有__len__()方法,所以他们都是len的鸭子。