Python高级编程(7):鸭子类型和多态
这个概念的名字来源于James Whitcomb Riley提出的鸭子测试:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
我们先来看一段代码:
1 | class Dog(object): |
在上面的例子里面,3个类彼此之间没有任何的继承关系(除object类以外所有的类都继承object这个类),但是它们都有一个say方法,也正是由于这个say方法的存在,使得它们可以同时被作为一个”类”进行访问,这就是鸭子类型。鸭子类(duck typing):是动态类型的一种风格,不是由继承特定的类或实现特定的接口,而是当前的方法和属性的集合决定,鸭子类型中关注的不是对象的类型本身,而是它如何使用。也就是说在刚才的例子里面,我们并没有关注你是谁的实例化对象:Dog,Cat,Duck,只要你们都具有say方法就够了。
我们再来看另外一个例子:
1 | a_list = ["envse1", "envse2"] |
我们在这里调用了list的extend方法,我们通过源码(按住Ctrl+鼠标左键)发现里面只要传入的参数是iterable就可以进行添加:
1 | def extend(self, iterable): # real signature unknown; restored from __doc__ |
所以就加深了我们对鸭子类型的印象。
现在说一下多态,在Java里面,实现多态的前提是具有继承关系,但在Python里面就不是了,python不支持多态,也不用支持多态,python是一种多态语言,崇尚鸭子类型,有鸭子类型这就够了。
[ - ] 参考文章:谈谈Python的鸭子类型、python鸭子类型
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 余思博客!
评论