要了解的Python哲學思想之Duck Typing

要了解的Python哲學思想之Duck Typing

一 Duck Typing介紹

Duck typing 作為python的哲學思想至關重要。Duck typing 這個概念來源於美國印第安納州的詩人詹姆斯·惠特科姆·萊利(James Whitcomb Riley,1849-

1916)的詩句:”When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.” ,其大致意思是:如果一隻鳥走起路來像鴨子,遊起泳來像鴨子,叫起來也像鴨子,我們就說它是隻鴨子。走路,游泳,叫都是這隻鳥的行為,而沒有涉及到它的血統繼承,他的基因就稱它為鴨子。也像我們的貓論,不管黑貓白貓,逮住老鼠就是好貓。在編程裡面翻譯過來就是如果一個對象不管其是否實現了某個接口或繼承某個類,只要能提供需要的方法或屬性,這就是我們 要的“鴨子”。

顯然,這種鴨子型編程是在動態語言的基礎上的,如果是靜態語言的話在運行前就需要檢查,是不會通過的何談執行。相較於規定模式的編程,它具有靈活的優勢。。從靜態類型語言轉向動態類型語言的用戶通常試圖添加一些靜態的(在運行之前的)類型檢查,從而影響了鴨子類型的益處和可伸縮性,並約束了語言的動態特性。

二 示例

class Duck():

def walk(self):

print('I walk like a duck')

def swim(self):

print('i swim like a duck')

class Person():

def walk(self):

print('this one walk like a duck')

def swim(self):

print('this man swim like a duck')

def walk(duck):

duck.walk()

def swim(duck):

duck.swim()

if __naem__ == "main":

duck = Duck()

person = Person()

walk(duck)

walk(person)

swim(duck)

swim(peson)

對於walk函數和swim函數只是需要一個能walk和swim的對象,不管是不是鴨子。單從walk和swim的角度來看,人也是鴨子了。

其實在python中,很多用到這種情況的地方,如果一個對象實現了__getitem__方法,那python的解釋器就會把它當做一個collection,就可以在這個對象上使用切片,獲取子項等方法;如果一個對象實現了__iter__和next方法,python就會認為它是一個iterator,就可以在這個對象上通過循環來獲取各個子項。


分享到:


相關文章: