Python面向對象編程從零開始(4)—— 小姐姐請客下篇

前言

前文傳送門:

Python面向對象編程從零開始(1)——從沒對象到有對象:ask.hellobi.com/blog/wa

Python面向對象編程從零開始(2)—— 與對象相互了解:ask.hellobi.com/blog/wa

Python面向對象編程從零開始(3)—— 小姐姐請客上篇:ask.hellobi.com/blog/wa

分割線---------------------------------------------------------------------------------------------------------------------------

又到了新的一周,繼續連載啊,哈哈

上次故事說到小姐姐請我吃大(pao)餐(mian),在煮泡麵的過程中出了點問題,就是,不管煮多久泡麵還是生的。

於是,意識到是代碼寫的有問題,我們開始修改代碼。

class Cook_instant_noodles:n n def __init__(self):n self.cookedState = 生的n self.cookedLevel = 0n n def __str__(self):n return 泡麵狀態:%s(%d)%(self.cookedState,self.cookedLevel)n n def cook(self,cooked_time):n if cooked_time >= 0 and cooked_time < 3:n self.cookedState = 還沒熟n elif cooked_time >= 3 and cooked_time < 5:n self.cookedState = 半生不熟n elif cooked_time >= 5 and cooked_time < 8:n self.cookedState = 煮熟了n elif cooked_time >= 8:n self.cookedState = 煮糊了n n#創建了一個泡麵對象ninstant_noodles = Cook_instant_noodles()nnprint(instant_noodles)nn#開始煮泡麵ninstant_noodles.cook(20)n

之前發現煮了20分鐘,還是生的

泡麵煮不熟的原因竟然是

原因在於:

程序執行的流程可以理解為這樣:

1.創建了一個對象

2.初始化

3.列印狀態

4.列印信息調用(這時候輸出的是初始化的信息,所以顯示生的)

5.對象調用cook方法,煮20分鐘

6.改變屬性(cookedState)(這時候屬性被改變為 煮糊了)

初步解決問題--更新輸出信息

所以,問題出在,我們改變了屬性,卻沒有把改變後的屬性顯示出來。

所以在最後加上一句即可:

print(instant_noodles)n

完整代碼:

class Cook_instant_noodles:n n def __init__(self):n self.cookedState = 生的n self.cookedLevel = 0n n def __str__(self):n return 泡麵狀態:%s(%d)%(self.cookedState,self.cookedLevel)n n def cook(self,cooked_time):n if cooked_time >= 0 and cooked_time < 3:n self.cookedState = 還沒熟n elif cooked_time >= 3 and cooked_time < 5:n self.cookedState = 半生不熟n elif cooked_time >= 5 and cooked_time < 8:n self.cookedState = 煮熟了n elif cooked_time >= 8:n self.cookedState = 煮糊了n n#創建了一個泡麵對象ninstant_noodles = Cook_instant_noodles()nnprint(instant_noodles)nn#開始煮泡麵ninstant_noodles.cook(20)nnprint(instant_noodles)n

面臨新問題,接受挑戰!

觀察結果,雖然第二次煮了20分鐘煮糊了,狀態得到改變了,但是,時間卻還是顯示0分鐘,這是為什麼呢?

我們回看代碼:

我們在cook方法中,通過傳參改變的只有cookedState,卻沒改變cookedLevel的值,所以cookedLevel一直保持初始值為0

再次解決問題--屬性大展風采

為了解決這個問題,我們要找個變數,就像累加器一樣,每次調用cook方法,我就加上相應的值

那麼,在類中,變數其實可以認為用屬性替代

我們將cookedLevel這一屬性作為累加器

self.cookedLevel += cooked_timen

self.cookedLevel += cooked_time 可以理解為 self.cookedLevel = self.cookedLevel + cooked_time

但兩者並不是完全相同,以後可能會講到

這樣,每次煮的時間就能累加存儲進去了

注意:對象多次調用某個方法,則要想用到上次的結果則要找到當前對象的一個屬性,讓屬性值變化,因為屬性值在對象結束時才消失(即理解為關掉程序則消失)

class Cook_instant_noodles:n n def __init__(self):n self.cookedState = 生的n self.cookedLevel = 0n n def __str__(self):n return 泡麵狀態:%s(%d)%(self.cookedState,self.cookedLevel)n n def cook(self,cooked_time):n n self.cookedLevel += cooked_timen n if cooked_time >= 0 and cooked_time < 3:n self.cookedState = 還沒熟n elif cooked_time >= 3 and cooked_time < 5:n self.cookedState = 半生不熟n elif cooked_time >= 5 and cooked_time < 8:n self.cookedState = 煮熟了n elif cooked_time >= 8:n self.cookedState = 煮糊了n n#創建了一個泡麵對象ninstant_noodles = Cook_instant_noodles()nnprint(instant_noodles)nn#開始煮泡麵ninstant_noodles.cook(20)nnprint(instant_noodles)n

這下,問題總算是解決了

小姐姐的新困擾--寶寶沒煮過面啊

雖然煮麵功能完成了,但是小姐姐提出了新問題,她表示之前都是泡麵,沒煮過面,所以不知道一次煮多久才能保證煮熟(不是生的也不煮糊)

so easy,我說,接下來就是體現面向對象的高端之處了。

因為之前20分鐘煮糊了,所以在1~19分鐘煮一分鐘看一下面的狀態就好

可是這怎麼實現呢

如果你之前認真閱讀並且有點小聰明,則應該看出來了吧

什麼?你沒看出么

好吧,我來詳細分析一下:

我們之前累加了狀態並且輸出狀態,當我們把19分鐘劃分為1分鐘一次依次看泡麵狀態是不是就ok了

接下來擼起袖子干!

class Cook_instant_noodles:n n def __init__(self):n self.cookedState = 生的n self.cookedLevel = 0n n def __str__(self):n return 泡麵狀態:%s(%d)%(self.cookedState,self.cookedLevel)n n def cook(self,cooked_time):n n self.cookedLevel += cooked_timen n if cooked_time >= 0 and cooked_time < 3:n self.cookedState = 還沒熟n elif cooked_time >= 3 and cooked_time < 5:n self.cookedState = 半生不熟n elif cooked_time >= 5 and cooked_time < 8:n self.cookedState = 煮熟了n elif cooked_time >= 8:n self.cookedState = 煮糊了n n#創建了一個泡麵對象ninstant_noodles = Cook_instant_noodles()nnprint(instant_noodles)nn#開始煮泡麵ninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)n

看暈了吧,我每次煮一分鐘,看一下泡麵狀態。

我們看看結果

完了,又煮不熟了

回看程序,發現我們最後是不是應該根據總的累積cookedLevel判斷狀態,而不是一次的cooked_time

所以修改代碼,將

中的cooked_time改為self.cookedLevel

class Cook_instant_noodles:n n def __init__(self):n self.cookedState = 生的n self.cookedLevel = 0n n def __str__(self):n return 泡麵狀態:%s(%d)%(self.cookedState,self.cookedLevel)n n def cook(self,cooked_time):n n self.cookedLevel += cooked_timen n if self.cookedLevel >= 0 and self.cookedLevel < 3:n self.cookedState = 還沒熟n elif self.cookedLevel >= 3 and self.cookedLevel < 5:n self.cookedState = 半生不熟n elif self.cookedLevel >= 5 and self.cookedLevel < 8:n self.cookedState = 煮熟了n elif self.cookedLevel >= 8:n self.cookedState = 煮糊了n n#創建了一個泡麵對象ninstant_noodles = Cook_instant_noodles()nnprint(instant_noodles)nn#開始煮泡麵ninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)nprint(instant_noodles)n

大功告成!通過觀察結果,為了節約時間和煤氣,5分鐘就能煮好泡麵。

粗心的小姐姐--吃面不加調料

小姐姐請我吃她煮的面

但我發現!尼瑪,怎麼沒放調料。。。

她解釋說,第一次,有點緊張

(旁白:前文說到過,小姐姐第一次煮泡麵)

這就是你不放調料的理由???

好吧,我只能:

加調料怎麼加,這是個問題。

我:先加什麼,後加什麼?

小姐姐:難道不是一次加進去的么,你當你吃拌面啊!?

於是需要將調料加到面裡面:

調料作為一些值需要保存在變數里,在面向對象中,則是保存在屬性里,又因為有很多種調料,所以我要找個能存放多種調料的容器

在這裡我們選擇list(列表)作為容器

在屬性里定義一個空列表:

self.condiments = []#定義調料列表n

定義一個加調料的方法:

def addCondiments(self,item):n #使用屬性保存數據n self.condiments.append(item)n

列表採用append()方法添加元素,這裡的傳進來的元素參數為item

由於要顯示出狀態中包含調料,所以要修改__str__()方法

def __str__(self):n return 泡麵狀態:%s(%d)%(self.cookedState,self.cookedLevel)n

所以改完之後是這樣的:

class Cook_instant_noodles:n n def __init__(self):n self.cookedState = 生的n self.cookedLevel = 0n self.condiments = []#定義調料列表n n def __str__(self):n return 泡麵狀態:%s(%d)),添加的佐料有:%s%(self.cookedState,self.cookedLevel,str(self.condiments))n n def cook(self,cooked_time):n n self.cookedLevel += cooked_timen n if self.cookedLevel >= 0 and self.cookedLevel < 3:n self.cookedState = 還沒熟n elif self.cookedLevel >= 3 and self.cookedLevel < 5:n self.cookedState = 半生不熟n elif self.cookedLevel >= 5 and self.cookedLevel < 8:n self.cookedState = 煮熟了n elif self.cookedLevel >= 8:n self.cookedState = 煮糊了n n def addCondiments(self,item):n #使用屬性保存數據n self.condiments.append(item)n

注意:

這裡的列表元素(調料)要轉成字元串輸出

下面,小姐姐開始煮第二碗面給她自己,第一碗面是之前忘加調料煮完的,我默默調料加進去了拌了拌。

#開始煮泡麵ninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.addCondiments(菜包)nninstant_noodles.addCondiments(粉包)nninstant_noodles.addCondiments(醬包)nninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.addCondiments(冰箱里的茶葉蛋)nninstant_noodles.addCondiments(冰箱里的火腿腸)nninstant_noodles.cook(1)nprint(instant_noodles)nnninstant_noodles.cook(1)nprint(instant_noodles)nninstant_noodles.cook(1)n

小姐姐加的調料:

看到結果的我眼淚掉下來

小姐姐這套路可以的。。。

想繼續邊聽講故事邊零基礎學習Python面向對象編程么,請持續關注連載~

作者:王大偉 Python愛好者社區唯一小編,請勿轉載,謝謝。

出處:Python面向對象編程從零開始(4)-- 小姐姐請客下篇

配套視頻教程:Python3爬蟲三大案例實戰分享:貓眼電影、今日頭條街拍美圖、淘寶美食 Python3爬蟲三大案例實戰分享

公眾號:Python愛好者社區(微信ID:python_shequ),關注,查看更多連載內容。

加小編個人微信:tsdatajob ,跟作者互動,一起探討。

推薦閱讀:

python中list, array的轉換
國慶回家避免不了相親,使用python抓取婚戀網妹子決策點快速脫單
【譯】Tempy-高性能面向對象的HTML模板庫
Python愛好者必看11個常用站點
十分鐘入門pandas(中)【解讀pandas官方文檔】

TAG:Python | Python教程 | 面向对象编程 |