python鸭子类型
python不支持多态,也不用支持多态,而是一种多态的语言。
鸭子类型(duck typing):是动态类型的一种风格,不是由继承特定的类或实现特定的接口,而是当前的方法和属性的集合决定,鸭子类型中关注的不是对象的类型本身,而是他如何使用。
这个概念的名字来源于James Whitcomb Riley提出的鸭子测试:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
我们可以这样理解:在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为鸭的对象,并调用它的走和叫方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。也许你对这段话还不理解,那么请看下面的例子:
>>> class duck(): #duck类型
def walk(self):
print('i am a duck,and i can walk')
def swim(self):
print('i am a duck,and i can swim')
>>> class cat(): #cat类型
def walk(self):
print('i am a cat,and i can walk')
def swim(self):
print('i am a cat,and i can swim')
实现一个动物walk和swim的功能函数:
>>> def walk_swim(animal):
animal.walk()
animal.swim()
创建对象以及调用walk_swim函数:
>>> d=duck()
>>> c=cat()
>>> walk_swim(d)
i am a duck,and i can walk
i am a duck,and i can swim
>>> walk_swim(c)
i am a cat,and i can walk
i am a cat,and i can swim
函数walk_swim的参数animal是任意类型,它可以接收任意类型的参数,当传入duck的对象d的时候,它会直接调用对象里面的walk和swim方法,如果对象里面没有该功能的方法,则会报错。
上面这种方法称为protocol(协议),这些protocol可以看做是通知型接口,它规定了调用该功能需要使用到对象的哪个方法,与java不同的是,它不需要继承,所以说是通知型接口
总结:鸭子类型的特点是:
1、变量绑定的类型具有不确定性
2、函数可以接收任意类型的参数
3、调用方法时不检查提供的参数类型
4、调用是否成功由参数的方法和属性确定
5、调用不成功抛出错误(也就是对象中没有实现该功能的方法)