1. 程式人生 > >Python_從零開始學習_(36) 面向物件封裝案例

Python_從零開始學習_(36) 面向物件封裝案例

目錄

 

1.  封裝

2.  小明愛跑步

3.  小明愛跑步 ---- 小美也愛跑步

4.  擺放傢俱

4.1  新增傢俱


1.  封裝

  1. 封裝 是面向物件程式設計的一大特點

  2. 面向物件程式設計的 第一步 ---- 將 屬性 和 方法 封裝 到一個抽象的 類 

  3. 外界 使用 類 建立 物件,  然後 讓物件呼叫方法

  4. 物件方法的細節 都被 封裝 類的內部

 

2.  小明愛跑步

需求

  1. 小明 體重 75.0 公斤
  2. 小明每次 跑步 會減肥 0.5 公斤
  3. 小明每次 吃東西 體重增加 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.  小明愛跑步 ---- 小美也愛跑步

需求

  1. 小明小美 都愛跑步
  2. 小明 體重 75.0 公斤
  3. 小美 體重 45 公斤
  4. 每次 跑步 都會減少 0.5 公斤
  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)
  1. 物件的方法內部,  是可以 直接訪問物件的屬性
  2. 同一個類 建立的 多個物件 之間,  屬性 互不干擾!

 

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)

小結

  1. 建立了一個 房子類,  使用到 __init__ 和 __str__兩個內建方法
  2. 準備了一個 add_item 方法 準備新增傢俱
  3. 使用 房子類 建立 一個房子物件
  4. 讓 房子物件 呼叫了三次 add_item 方法,  將 三件傢俱 以實參傳遞到 add_item 內部

4.1  新增傢俱

  1. 判斷 傢俱的面積 是否 超過剩餘面積,  如果超過,  提示不能新增這件傢俱
  2. 傢俱的名稱 追加到 傢俱名稱列表
  3. 房子的剩餘面積 -- 傢俱面積
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]
# 傢俱: ['席夢思', '衣櫃', '餐桌']