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真的很迷人.