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、調用不成功拋出錯誤(也就是對象中沒有實現該功能的方法)


 










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