一、了解面向對象的封裝
封裝是面向對象編程的一大特性,當我們面向對象編程的時候第一步就是先做需求分析然后根據明確的職責將不同的屬性和方法封裝到一個又一個抽象的類中。之所以說是抽象的類,因為在開發程序中類是不能直接使用的,當定義好一個類之后,在外界也就是類的代碼外部來使用類創建對象,然后再讓這個對象去調用我們封裝在類中的各個方法。
強調一點:對象方法的細節都是被封裝在類的內部的,在外界只需要使用類創建對象,然后讓對象調用方法。
總結:
- 封裝是面向對象編程的一大特點
- 面向對象編程的第一步:將屬性和方法分裝到一個抽象的類中
- 外界使用類創建對象,然后讓對象調用方法
- 對象方法的細節都被封裝在累的內部
二、封裝案例——小夏愛跑步
2.1 需求分析
需求:
- ****小夏體重****55.5公斤
- 小夏每次****跑步****會減體重0.5公斤
- 小夏每次****吃東西****體重會增加1公斤
當看到需求后,應該用名詞提煉法把需求中的名詞提煉出。在需求中可以看出有個叫小夏的人類,那么可以定義一個叫做Person的類,在這類中然后看出這個人類的其他屬性特征,比如名字和體重分別用name和weight來記錄。以上是需求中的名詞屬性接下來看需求中的動詞,不難看出跑步和吃東西是動詞,那么在類中定義兩個方法,一個run(self)一個eat(self)。再看需求,跑步和吃飯都會影響到體重這個屬性,每次跑步會減體重0.5公斤,每次吃東西體重會增加1公斤。
這個案例主要復習之前的init初始化方法,利用這個初始化方法來簡化對象的創建,同時復習一下str這個內置方法,通過這個方法來簡化一下小夏對象的輸出。
2.2 代碼
下圖是完成了一大半的代碼,剩下兩個方法沒有完成,目前用pass占位符代替,只是先看看代碼總體有沒有出錯,是否可以正常運行,結果顯示時沒問題的。接下來在寫類中具體的兩個方法。
完整代碼:
class Person:
# 初始化方法:簡化對象的創建
def __init__(self, name, weight):
# self.屬性 = 形參
self.name = name
self.weight = weight
# 內置方法__str__(self):簡化對象的輸出
def __str__(self):
# 這個方法需要注意必須要返回一個字符串
# .2f 表示在遇到小數的時候只保留2位小數
return "我的名字叫 %s 體重是%.2f 公斤" % (self.name, self.weight)
def run(self):
print("%s 愛跑步,跑步可以鍛煉身體也可以減肥" % self.name)
# 每次跑步體重減少0.5公斤
self.weight -= 0.5
def eat(self):
print("%s 愛吃,是個吃貨" % self.name)
# 每次吃東西體重增加1公斤
self.weight += 1
# 創建小夏對象
xiaoxia = Person("小夏", 55.5)
xiaoxia.run()
xiaoxia.eat()
print(xiaoxia)
運行結果:
代碼總結:
上圖中折疊了Person類,在類的外部創建了叫小夏的對象,在對象中傳入參數名字和體重,然后對象去調用在類中的兩個方法,最后輸出這個對象。
提示:在對象的方法內部是可以直接訪問對象的屬性的。
如下圖:在案例中不僅輸出了小夏的名字還同時修改了小夏的體重
三、案例擴展——多個對象之間屬性互不干擾
小夏愛跑步擴展之小菜也愛跑步。
需求:
- 小夏愛跑步,小菜也愛跑步
- 小夏體重55.5公斤
- 小菜體重60公斤
- 每次跑步都會減少0.5公斤
- 每次吃東西都會增加1公斤
3.1需求分析
****分析:****
分別有小夏和小菜兩個人物,可以看做是兩個對象,他們各自都有各自的體重。同樣可以使用一個Person類,在這個類中定義兩個屬性,一個name,一個 weight。體重每次跑步和吃東西都會變化,這2個方法的描述是完全一樣的意味著在類中分裝的2個代碼具體的代碼實現也是完全相同的,只是在這兩個方法執行過程中各自修改不同對象的體重屬性。代碼是一樣的,但是修改的屬性是根據調用的對象不同而不同。
3.2代碼
只是在上面的代碼中創建一個小菜對象,小菜對象再去調用跑步和吃東西的方法,左后輸出小菜這個對象。
****提示:同一個類創建的多個對象之間,屬性互不干擾。****
具體代碼如下圖:
結果分析:
運行完小菜對象的代碼后可以看出并不會影響到小夏的體重變化,這個因為代碼在運行的過程中,在28行先在內存中開辟一個空間來存儲小夏對象的兩個屬性一個名字一個體重,再執行下面兩個方法,最后輸出小夏對象。然后運行到36行代碼創建小菜對象,在內存中同樣開辟另外一個空間分別存儲name和weight,執行兩個方法,最后輸出小菜對象。在這一列過程中,兩個對象之間的屬性并沒有被互相干擾到。
面向對象編程中使用同一個類可以創建出不同的對象,根據實際的場景每一個對象的屬性會各自發生變化,但是多個對象之間屬性彼此是互不干擾的。
以上就是關于面向對象案例的一個小小分析和代碼演練,更多Python編程題可以關注Python自學網,不斷更新。