Python_從零開始學習_(36) 面向物件封裝案例
阿新 • • 發佈:2018-11-02
目錄
1. 封裝
-
封裝 是面向物件程式設計的一大特點
-
面向物件程式設計的 第一步 ---- 將 屬性 和 方法 封裝 到一個抽象的 類 中
-
外界 使用 類 建立 物件, 然後 讓物件呼叫方法
-
物件方法的細節 都被 封裝 在 類的內部
2. 小明愛跑步
需求
- 小明 體重 75.0 公斤
- 小明每次 跑步 會減肥 0.5 公斤
- 小明每次 吃東西 體重增加 1 公斤
類 = > Person
屬性 = > name , height
方法 = > run( ) , eat( )
提示: 在 物件的方法內部, 是可以直接訪問物件的屬性 的!
- 程式碼實現:
class Person: def __init__(self, name, height): # self.屬性 = 形參 self.name = name self.height = height def __str__(self): return "我的名字叫 %s 體重是 %.2f 公斤" % (self.name, self.height) def run(self): print("%s 愛跑步, 跑步鍛鍊身體" % self.name) self.height -= 0.5 def eat(self): print("%s 喜歡吃東西, 吃東西好快樂" % self.name) self.height += 1 xiaoming = Person("小明", 70) xiaoming.run() xiaoming.eat() print(xiaoming)
3. 小明愛跑步 ---- 小美也愛跑步
需求
- 小明 和 小美 都愛跑步
- 小明 體重 75.0 公斤
- 小美 體重 45 公斤
- 每次 跑步 都會減少 0.5 公斤
- 每次 吃東西 都會增加 1 公斤
class Person: def __init__(self, name, height): # self.屬性 = 形參 self.name = name self.height = height def __str__(self): return "我的名字叫 %s 體重是 %.2f 公斤" % (self.name, self.height) def run(self): print("%s 愛跑步, 跑步鍛鍊身體" % self.name) self.height -= 0.5 def eat(self): print("%s 喜歡吃東西, 吃東西好快樂" % self.name) self.height += 1 xiaoming = Person("小明", 70) xiaoming.run() xiaoming.eat() print(xiaoming) # 小美愛跑步 xiaomei = Person("小美", 45) xiaomei.eat() xiaomei.run() print(xiaomei) print(xiaoming)
- 在 物件的方法內部, 是可以 直接訪問物件的屬性 的
- 同一個類 建立的 多個物件 之間, 屬性 互不干擾!
4. 擺放傢俱
1. 房子(House) 有 戶型, 總面積 和 傢俱名稱列表
- 新房子沒有任何的傢俱
2. 傢俱(HouseItem) 有 名字 和 佔地面積, 其中
- 席夢思(bed) 佔地 4 平米
- 衣櫃(chest) 佔地 2 平米
- 餐桌(table) 佔地 1.5 平米
3. 將以上三件 傢俱 新增 到 房子 中
4. 列印房子時, 要求輸出: 戶型, 總面積, 剩餘面積, 傢俱名稱列表
類 : 房子類(House) 類 : 傢俱類(HouseItem)
屬性: house_type, area,free_area, item_list 屬性: name, area
方法:add_item
剩餘面積
1. 在建立房子物件時, 定義一個 剩餘面積的屬性, 初始值和總面積相等
2. 當呼叫 add_item 方法, 向房間 新增傢俱 時, 讓 剩餘面積 -= 傢俱面積
class HouseItem:
def __init__(self, name, area):
self.name = name
self.area = area
def __str__(self):
return "[%s] 佔地 %.2f" % (self.name, self.area)
class House:
def __init__(self, house_type, area):
self.house_type = house_type
self.area = area
# 剩餘面積
self.free_area = area
# 傢俱名稱列表
self.item_list = []
def __str__(self):
return ("戶型: %s\n總面積: %.2f[剩餘: %.2f]\n傢俱: %s"
% (self.house_type, self.area,
self.free_area, self.item_list))
def add_item(self, item):
print("要新增 %s" % item)
# 建立傢俱
bed = HouseItem("席夢思", 4)
chest = HouseItem("衣櫃", 2)
table = HouseItem("餐桌", 1.5)
print(bed)
print(chest)
print(table)
# 建立房子
my_home = House("三室兩廳", 130)
print(my_home)
my_home.add_item(bed)
my_home.add_item(chest)
my_home.add_item(table)
小結
- 建立了一個 房子類, 使用到 __init__ 和 __str__兩個內建方法
- 準備了一個 add_item 方法 準備新增傢俱
- 使用 房子類 建立 一個房子物件
- 讓 房子物件 呼叫了三次 add_item 方法, 將 三件傢俱 以實參傳遞到 add_item 內部
4.1 新增傢俱
- 判斷 傢俱的面積 是否 超過剩餘面積, 如果超過, 提示不能新增這件傢俱
- 將 傢俱的名稱 追加到 傢俱名稱列表 中
- 用 房子的剩餘面積 -- 傢俱面積
class HouseItem:
def __init__(self, name, area):
self.name = name
self.area = area
def __str__(self):
return "[%s] 佔地 %.2f" % (self.name, self.area)
class House:
def __init__(self, house_type, area):
self.house_type = house_type
self.area = area
# 剩餘面積
self.free_area = area
# 傢俱名稱列表
self.item_list = []
def __str__(self):
return ("戶型: %s\n總面積: %.2f[剩餘: %.2f]\n傢俱: %s"
% (self.house_type, self.area,
self.free_area, self.item_list))
def add_item(self, item):
print("要新增 %s" % item)
# 1. 判斷傢俱的面積
if item.area > self.free_area:
print("%s 的面積太大了, 無法新增" % item.name)
return
# 2. 將傢俱的名稱新增到列表中
self.item_list.append(item.name)
# 3. 計算剩餘面積
self.free_area -= item.area
# 建立傢俱
bed = HouseItem("席夢思", 4)
chest = HouseItem("衣櫃", 2)
table = HouseItem("餐桌", 1.5)
print(bed)
print(chest)
print(table)
# 建立房子
my_home = House("三室兩廳", 130)
my_home.add_item(bed)
my_home.add_item(chest)
my_home.add_item(table)
print(my_home)
# 列印結果
# [席夢思] 佔地 4.00
# [衣櫃] 佔地 2.00
# [餐桌] 佔地 1.50
# 要新增 [席夢思] 佔地 4.00
# 要新增 [衣櫃] 佔地 2.00
# 要新增 [餐桌] 佔地 1.50
# 戶型: 三室兩廳
# 總面積: 130.00[剩餘: 122.50]
# 傢俱: ['席夢思', '衣櫃', '餐桌']