python鸭子类型

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、调用不成功抛出错误(也就是对象中没有实现该功能的方法)


 










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章