上一堂課,我們依據wiki的詞條逐項說明了物件導向的一些基本特性--而那大多聚焦在屬性這件事情上面。這一堂課我們會開始講解物件導向的另外一個重要特性:方法。 我們承續上一堂的人類物件來繼續吧。 ```python class Human: def __init__(self): self.name = '' #他有180公分高 self.height = 180 #有80公斤重 self.weight = 80 def what_is_your_name(self): return self.name def BMI(self): return self.weight/(self.height/100) ^ 2 ``` 和上一堂的人類物件相比,我們底下多了兩個def,這種屬於物件的子程式我們通常會稱呼其為方法。屬於物件的「每一個方法」都一定會接收一個標準參數self,這是為了在方法內可以自由存取自身變數的一種戰術(?)。 注意:因為不管你寫不寫物件內都會傳送這個參數,因此請不要在函數變數內忽略這個self--大多數新手寫物件最常發生的錯誤就是參數溢出(忘記寫self)。 而我們同樣以上一堂的內容比喻,有人問了小明你的本名是什麼,這時候相當於以下這樣的程式碼: ```python 小明.what_is_your_name() ``` 當然,我想一定會有人發現,我們上一堂課不是使用小明.name來存取名字嗎? 這時候我們可以想像一下,一般來說個人資訊都不應該可以由外人直接查詢(當然現在這時代不好說了......)。這時候我們想知道某個人的名字,就必須藉由詢問等等間接方法得知。 或許以名字為例有點簡略了。我們換個問題,我們想知道小明的BMI時要怎麼辦呢? 以往我們大概會這麼做吧: ```python 小明.weight/(小明.height/100) ^ 2 ``` 翻譯成人類語言就是:小明,你的身高體重多少?(一段時間的心算)喔,原來小明的BMI是多少多少。 那我們用物件的概念來看看? ```python 小明.BMI() ``` 慣例翻譯成人類語言:小明,你的BMI多少? 小明(一段時間的心算):我的BMI是多少多少。 這時候物件內的BMI方法會直接幫我們計算小明的BMI--即使我們完全不知道小明的身高體重,也可以得到精確的BMI值。可以想像成計算的問題交給物件去解決,我們調用物件的人不需要在意內部怎麼計算的。這在程式上可以增加程式碼間的獨立性--尤其是專案越大,若這些基本計算都要獨立寫在主程式裡面,管理起來會相當麻煩。 另外一個好處是,如果今天BMI的計算方式發生改變,我們只需要變更human這個類別的方法,所有宣告為human類別的物件都可以一起變更為新的計算方法。也就是即使今天有小明小華等100個人,也只需要一次變更即可,以維護的觀點來說無疑也是比較好的方案。 ------------------------------ 在BMI這個方法裡面我們可以看到self的大量使用,在python裡面遇到物件會很常態性的使用它......用久了其實還算滿方便的。 物件的屬性和方法大概的概念就到這邊,下一堂課我們會稍微講一些物件導向設計的小技巧,以及最後的總結。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up