面向对象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的鸭子。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值