論光棍的最高境界:一切皆對象
論光棍的最高境界:一切皆對象
之前在揭開“神秘的面紗”一文中有提到,python是“平易近人”的,是“接地氣”的;它的“接地氣”不僅體現在其語法的精簡上,更重要的是它采用了面向對象這一編程範式,這讓它離機器更遠一步的同時,離我們更近了一步。
為了讓大家更好地理解一切皆對象這一境界的具體內涵,我在此就面向對象與面向過程這兩種編程範式的概念分別做個說明,並由此引申出面向對象、面向過程、機器、程序員這四者間的“愛恨情仇”。
面向過程。什麽是過程?過程就是完成某個事件的動作,這個動作可以按照先後順序拆解成一個個簡單的步驟。舉個簡單的例子:要如何把一頭大象裝進冰箱。把大象裝進冰箱是一個動作,而這個動作可以具體分解成三個簡單的步驟:1、打開冰箱。2、把大象放進去。3、關上冰箱。你看,其實就是這麽簡單。或許你會問:把大象裝進冰箱(Are you kidding?!)
面向對象。什麽是對象?對象就是一個獨立的個體(不然怎麽和對象談戀愛啊,怎麽和對象深入交流啊),他/她會有自己的名字,有自己的特征(身高體重性格愛好什麽的),也可以獨立完成某些動作(處對象總要可以打kiss吧,不然真是太絕望了),這種獨立的個體就可以稱之為對象。同樣是如何把大象裝進冰箱這個問題。我們可以在這個問題中找到三個對象:1、完成把大象裝進冰箱這個動作的人(暫是叫他A吧)。2、大象。3、冰箱。這麽一劃分,各種頭腦風暴就來了。A可以是一個力氣超級大的大力士,長得非常魁梧,他可以直接把大象抱起來,完成放進冰箱這一動作;也可以是具備某種大型機械設備操作能力的人,利用大型機械設備(超大挖掘機?)
一切皆對象。要學習好python就要有那種一切皆對象的霸氣,當你看誰都像是對象的時候(絕對的資深光棍),那麽你離python出師也就不遠了。python中的一些數據結構其實是一種對象,python中的函數也是一種對象,更不用說類了;以往面向過程的思維模式經常會對我們學習python產生誤導,在接觸面向對象之前誰能想到一個簡單的變量也能成為對象呢,就像你能把一片樹葉,一滴水甚至是空氣當成你的女朋友嗎?以下是我在python交互式命令行中執行的兩個指令:
從這個顯示結果可以看到變量a (在python中稱它為標簽a會比較形象,這個在後面python的動態特性中會講) 其實是類int()的一個實例。(類的實例就是對象) 這個結果其實就已經說明了,變量a是一個對象。(type()方法的作用返回數據結構的類型)
接下來我就介紹一下面向對象、面向過程、機器和程序員這四者間的愛恨情仇。上文中其實已經隱晦的提到了它們四者間的關系。
在以面向過程的範式編寫程序時,程序代碼的邏輯要偏向機器的邏輯,換句話說就是——機器和面向過程更親,他們之間更有共同語言(要深入探尋C和機器之間聯系可以去看看匯編,其實匯編的面向過程更加明確直觀);說的更現實點就是,機器就是“祖宗”,你(程序員)面向過程的時候要對“祖宗”“察言觀色”,把“祖宗”給“伺候”好了,“祖宗”要是不高興了,那就是“罷工”你也沒轍。
而在以面向對象的範式編寫程序時,你(程序員)可以不用去看機器的“臉色”,自由發揮你的能力,你想要怎麽"DIY"都可以,當然,你“DIY”的實現要遵循python的既定規則。這就好比商家(程序員)要出售一個產品,有一個代理商(編譯器,就是C)會幫你把產品出售給客戶;只要你的產品指標是符合與代理商所簽訂的合同(python的既定規則)的,那麽,對於可以的各種“無理”要求你都不用去操心了,自有代理商幫你解決,你只要用心設計生產你所需要的產品就行了。
面向對象、面向過程、程序員、機器四者間的直接關系如下:
面向對象編程時:程序員 --> 面向對象(python) --> 面向過程(C)--> 機器
面向過程編程時:程序員 --> 面向過程(C)-->機器
面向對象編程(python)比面向過程編程(C)多了一個步驟,很簡單的可以理解到,面向對象編程(python)執行效率肯定是比面向過程編程(C)的,雖然面向對象編程(python)能使我們更方便進行頭腦風暴,到底使用面向對象編程還是面向過程編程就看具體的項目和個人習慣了。
上帝在為你打開一扇門的同時也會幫你關上另一扇門;你想走獨木橋到河對岸去就註定離你原岸越來越遠。
論光棍的最高境界:一切皆對象