python的多態性學習思考1

python的多態性

python的多態性, 是非常靈活的,是我非常喜愛的一個特點,也是讓我決定拿python作爲我的現階段主要開發語言的原因之一.

相信在任何語言中,多態性都是最迷人的一個特性.學習過次c++的人都是非常明確多態的定義的(雖然你不一定理解).

c++的多態,一句話就是基於類的, 比如貓 ,狗, 豬,這些都是動物 ,動物是一個基類, 如果我們向動物這個類發出一個命令-----吃東西,那麼他們都會按照自己的方式來吃東西.

這就是多態 . 這裏的動物涵蓋了 貓 ,狗, 豬 . 也就是說,很多的對象市隱藏在這個基類的接口中的.

 c++的多態並不是默認的,因爲使用這個會佔用一定內存, 我們必須顯式的聲明 一個方法 ---使用虛函數機制.

但是python 的多態有着非常大的不同.

(1)首先,python的多態性是默認的, 融化在這個語言核心的.

(2)python的多態性是行爲多態.也就是基於行爲協議的.

什麼是行爲多態?有很多種說法

(1)通俗的說: 你看起來像什麼,那麼你就是什麼.

(2)一個對象的意義取決於你對他做什麼

還是舉幾個python裏的例子.

(1)相信大家對python的for語句應該相當熟悉,這裏用到了迭代協議.有着迭代語境.

for i in range(10):

for i in range(10):
    print i
這裏做了三個動作:

第一,啓動,生成了一個迭代器 調用range(10).__iter__,在python3裏,可以調用內置函數iter()

第二,調用迭代器的range(10).__next__方法(python3.x)

第三,捕捉異常

也就是說只要我們的對象實現了 __iter__,__next__的接口協議,那麼就可以使用這個for循環.

(2)print打印

print "hello world"
這裏發生了什麼?你猜對了,這裏也有着非常奇妙的多態性.python的多態無處不在.

這裏發生了兩個動作:

第一,import sys

第二,sys.stdout.wirte("hello world")

這裏實現的是寫文件的協議.默認情況下,我們的標準輸出流是鏈接到終端.

I/O是類文件對象,想像一下, 如果我們實現了一個類文件對象,也就是write協議, 然後把標準輸出流重定向到這個類文件對象,那麼所有的print就是在向這個類文件發送數據了.

import sys
sys.stdout  = open("log.txt", "a")
.......
print "hello world"

發揮我們的想象,比如raw_input,我們也可以定製

比如上下文協議.只要我們的對象實現了某些協議,那麼我們的對象就是某些特定的對像,有着某些特定的行爲.從而普適用與一些特定的接口,這就是行爲多態.

這裏的運用就有好多了

StringIO   一個字符串緩衝模塊

tempfile  臨時文件對象

socket   套接字

.....

這些都是類文件對象

還有好多東西可以深入瞭解, python真的很迷人.

發佈了40 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章