當前位置:
首頁 > 知識 > 換個角度思考「類」

換個角度思考「類」

換個角度思考「類」

我的一個朋友在學習Python。我很高興,因為我一直在推薦身邊人學習Python,我也非常願意輔導他們學習編程。

我想做一個實驗,我希望我能夠教會一個初學者理解類,而這個理解過程能讓他覺得很自然、不困難。作為一個思想實驗,我們先假設Python沒有類這個特性。如果我們要實現類似面向對象的功能,我們要怎麼做?

這篇文章假設你有Python的基礎知識(函數、變數、列表、字典等)。如果你是完全的0基礎,你可以先看下Python部落(python.freelycode.com)影音學堂中的入門課程。

什麼是類、對象和面向對象?簡單地說,面向對象就是把數據看成一個實實在在的東西。比如,你可以讓數據代表一個人,或者一個動物。下面的例子中,我們假設我們的數據代表一個人。所以「類」代表構建一個人的方法。一個人有自己的名字、自己的發色等「屬性」。人還會有一些動作,比如刷牙、看電視。對象就代表一個人,可能有一個對象代表我,有一個對象代表你。類和對象是不同的。我們來看個例子:

換個角度思考「類」

這個例子中我們創建了一個變數my_name,以它為參數調用函數first_name,這樣我們獲得了我們全名中的first name。這很酷,但是功能還很有限。我希望我們的代碼能代表我,而不僅僅是我的名字。

換個角度思考「類」

我們改善了一下代碼,這個代碼可以代表我這個人了。我們還增加了一些函數,這些函數是「我」這個對象的動作。其中一些函數是信息獲取函數(getter),傳入整個對象,返回其中一部分信息。例如,first_name函數就是從對象信息中只取出first name的信息並返回出來。跟信息獲取函數對應的是信息設置函數(setter),它們需要一些數據參數,並把這些數據設置到對象上。

然而,這還不夠。如果我還想支持另外一個人,比如Dr Wily,我需要確認我創建的列表是正確的。我需要保證列表的第一項是first name,第二項是last name,等等。下面我對代碼做了一點點補充:

換個角度思考「類」

這樣好多了。如果有其他人想要用我的代碼來創建一個「人的對象」,已經非常容易了。使用我的代碼的人不需要管理列表中的所有項了,因為我的代碼幫他管理了列表的內容。然後,這仍然是不夠的。因為我現在用的是列表,列表處理一列東西很好(比如存儲書的目錄),但是用它來表示對象的屬性就不太合適了。這時候字典就派上用場了!現在我用字典來代替前面的列表:

換個角度思考「類」

換個角度思考「類」

很明顯這樣做好了很多。如果我的程序有上千行長,現在我們在函數內也能清晰地看出這個函數正在處理的是哪些屬性了。其他人看這個代碼也會更容易理解。現在,維護我代碼的人應該也不會咒我去死了。

這時,如果我把這個代碼改寫為一個類,可以看到整體的模式是非常接近我前面的代碼的:

換個角度思考「類」

除了class這個單詞,還有哪裡有區別?這次我們把數據存在了屬於對象的屬性上,替換掉了我們的字典。我在所有的變數名前面加個雙下劃線,這樣我就告訴了其他開發者這個變數不公開,你不要使用。然後每一個函數的第一個參數變成了self,self指的是你當前正在處理的這個對象。類裡面函數的第一個參數總是代表當前對象,你可以不叫它self,但是這會讓其他開發者感覺很奇怪。

回到我們編寫的類上,如果我想繼承這個類怎麼辦?比如我想創建一個叫「程序員」的類,讓它繼承於Person:

換個角度思考「類」

換個角度思考「類」

這裡演示了我如何利用前面寫的代碼,進一步構建我的新對象。如果我想確保我的新代碼有許可權訪問Person類設置的屬性,那麼我就需要在我的init_programer裡面調用init_person方法。如果我不這樣做,當我試圖獲取programer的name屬性的時候,就會報錯。我也可以在init_programer裡面再實現一遍init_person的功能,但是這樣太浪費時間了。這樣做和在類中使用super方法的效果是一樣的,不同之處在於super方法額外還處理了各級類初始化代碼執行順序的問題。如果你的繼承關係類似這樣:Animal -> Mammal -> Person -> Programer,那麼super也會按照這個順序依次執行初始化操作。下面是一個例子:

換個角度思考「類」

希望這樣解釋你能聽懂,編程快樂!

換個角度思考「類」


英文原文:https://propersquid.com/posts/another-way-to-think-about-classes/

譯者:詩書塞外

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

開發好的程序,為什麼會有bug?
Python Exceptions介紹

TAG:Python部落 |