『无为则无心』Python面向对象 — 49、面向对象综合应用

1、烤地瓜

(1)需求

1)被烤的时间和对应的地瓜状态:

  • 0-3分钟:生的。
  • 3-5分钟:半生不熟。
  • 5-8分钟:熟的。
  • 超过8分钟:烤糊了。

2)添加的调料:

用户可以按自己的意愿添加调料。

(2)步骤分析

需求涉及一个事物: 地瓜,故案例涉及一个类:地瓜类。

1)地瓜的属性:

  • 被烤的时间。
  • 地瓜的状态。
  • 添加的调料。

2)地瓜的方法:

  • 被烤。
    • 用户根据意愿设定每次烤地瓜的时间。
    • 判断地瓜被烤的总时间是在哪个区间,修改地瓜状态。
  • 添加调料。
    • 用户根据意愿设定添加的调料。
    • 将用户添加的调料存储。
  • 显示对象信息。

(3)代码实现

1)地瓜属性。

定义地瓜初始化属性,后期根据程序推进更新实例属性。

class SweetPotato():
    def __init__(self):
        # 被烤的时间
        self.cook_time = 0
        # 地瓜的状态
        self.cook_static = '生的'
        # 调料列表
        self.condiments = []

2)定义烤地瓜方法。

class SweetPotato():
    ......

    def cook(self, time):
        """烤地瓜的方法"""
        # self.cook_time是已考过的时间
        # time是这次考的时间,调用一次cook方法就算考一次
        self.cook_time += time
        if 0 <= self.cook_time < 3:
            self.cook_static = '生的'
        elif 3 <= self.cook_time < 5:
            self.cook_static = '半生不熟'
        elif 5 <= self.cook_time < 8:
            self.cook_static = '熟了'
        elif self.cook_time >= 8:
            self.cook_static = '烤糊了'

3)书写str魔法方法,用于输出对象状态。

class SweetPotato():
        ......

    def __str__(self):
        return f'这个地瓜烤了{self.cook_time}分钟, 状态是{self.cook_static}'

4)创建对象,测试实例属性和实例方法。

# 创建对象
digua1 = SweetPotato()
# 打印对象中的__str__方法
# 这个地瓜烤了0分钟, 状态是生的, 添加的调料有[]
print(digua1)
# 调用对象的烹饪cook方法
digua1.cook(2)
# 再查看地瓜状态
# 这个地瓜烤了2分钟, 状态是生的, 添加的调料有[]
print(digua1)

5)定义添加调料方法,并调用该实例方法。

class SweetPotato():
        ......

    # 添加调料方法
    def add_condiments(self, condiment):
        """添加调料"""
        self.condiments.append(condiment)
    def __str__(self):
        return f'这个地瓜烤了{self.cook_time}分钟, 状态是{self.cook_static}, 添加的调料有{self.condiments}'


# 创建对象
digua1 = SweetPotato()
# 打印对象中的__str__方法
# 这个地瓜烤了0分钟, 状态是生的, 添加的调料有[]
print(digua1)


# 调用对象的烹饪cook方法
digua1.cook(2)
# 调用添加调料
digua1.add_condiments('酱油')
# 再查看地瓜状态
# 这个地瓜烤了2分钟, 状态是生的, 添加的调料有['酱油']
print(digua1)


# 再烤两分钟,再加调料
# 这个地瓜烤了4分钟, 状态是半生不熟, 添加的调料有['酱油', '辣椒面儿']
digua1.cook(2)
digua1.add_condiments('辣椒面儿')
print(digua1)

# 还不熟继续烤
# 这个地瓜烤了6分钟, 状态是熟了, 添加的调料有['酱油', '辣椒面儿']
digua1.cook(2)
print(digua1)

(4)代码总览

# 定义类
class SweetPotato():
    def __init__(self):
        # 被烤的时间
        self.cook_time = 0
        # 地瓜的状态
        self.cook_static = '生的'
        # 调料列表
        self.condiments = []

    # 烤白薯方法
    def cook(self, time):
        """烤地瓜的方法"""
        # self.cook_time是已考过的时间
        # time是这次考的时间,调用一次cook方法就算考一次
        self.cook_time += time
        if 0 <= self.cook_time < 3:
            self.cook_static = '生的'
        elif 3 <= self.cook_time < 5:
            self.cook_static = '半生不熟'
        elif 5 <= self.cook_time < 8:
            self.cook_static = '熟了'
        elif self.cook_time >= 8:
            self.cook_static = '烤糊了'

    # 添加调料方法
    def add_condiments(self, condiment):
        """添加调料"""
        # 用户意愿的调料追加到调料列表
        self.condiments.append(condiment)

    def __str__(self):
        return f'这个地瓜烤了{self.cook_time}分钟, 状态是{self.cook_static}, 添加的调料有{self.condiments}'

# 创建对象并调用对应的实例方法
# 创建对象
digua1 = SweetPotato()
# 打印对象中的__str__方法
# 这个地瓜烤了0分钟, 状态是生的, 添加的调料有[]
print(digua1)


# 调用对象的烹饪cook方法
digua1.cook(2)
# 调用添加调料
digua1.add_condiments('酱油')
# 再查看地瓜状态
# 这个地瓜烤了2分钟, 状态是生的, 添加的调料有['酱油']
print(digua1)


# 再烤两分钟,再加调料
# 这个地瓜烤了4分钟, 状态是半生不熟, 添加的调料有['酱油', '辣椒面儿']
digua1.cook(2)
digua1.add_condiments('辣椒面儿')
print(digua1)

# 还不熟继续烤
# 这个地瓜烤了6分钟, 状态是熟了, 添加的调料有['酱油', '辣椒面儿']
digua1.cook(2)
print(digua1)

# 再继续烤,要烤糊白薯
# 这个地瓜烤了8分钟, 状态是烤糊了, 添加的调料有['酱油', '辣椒面儿']
digua1.cook(2)
print(digua1)

2、搬家具

(1)需求

将小于房子剩余面积的家具摆放到房子中

(2)步骤分析

需求涉及两个事物:房子 和 家具,故被案例涉及两个类:房子类 和 家具类。

1)房子类

  • 实例属性
    • 房子地理位置
    • 房子占地面积
    • 房子剩余面积
    • 房子内家具列表
  • 实例方法
    • 容纳家具
  • 显示房屋信息

2)家具类

  • 家具名称
  • 家具占地面积

(3)代码实现

1)家具类

class Furniture():
    def __init__(self, name, area):
        # 家具名字
        self.name = name
        # 家具占地面积
        self.area = area

# 创建一张双人床, 占地面积6
bed = Furniture('双人床', 6)
sofa = Furniture('沙发', 10)

2)房子类

class Home():
    def __init__(self, address, area):
        # 地理位置
        self.address = address
        # 房屋面积
        self.area = area
        # 剩余面积
        self.free_area = area
        # 家具列表
        self.furniture = []

    def __str__(self):
        return f'房子坐落于{self.address}, 占地面积{self.area}, 剩余面积{self.free_area}, 家具有{self.furniture}'

    # 添加家具的方法,item是一个家具的示例对象
    def add_furniture(self, item):
        """容纳家具"""
        # 剩余面积大于家具面积,才可以添加家具
        if self.free_area >= item.area:
            # 添加到家具列表中
            self.furniture.append(item.name)
            # 家具搬入后,更新房屋剩余面积
            # 房屋剩余面积 = 之前剩余面积 - 该家具面积
            self.free_area -= item.area
        else:
            print('家具太大,剩余面积不足,无法容纳')


# 创建一个房子1实例: 在北京, 1000平
jia1 = Home('北京', 1000)
# 房子坐落于北京, 占地面积1000, 剩余面积1000, 家具有[]
print(jia1)

# 添加家具,参数是传入一个家具的实例
jia1.add_furniture(bed)
print(jia1)

3)创建对象并调用实例属性和方法

# 创建家具实例
bed = Furniture('双人床', 6)
# 创建房屋实例
jia1 = Home('北京', 1200)

# 房屋现状
# 房子坐落于北京, 占地面积1200, 剩余面积1200, 家具有[]
print(jia1)
# 添加家具到房屋
jia1.add_furniture(bed)
# 查看房屋现状
# 房子坐落于北京, 占地面积1200, 剩余面积1194, 家具有['双人床']
print(jia1)

# 添加个篮球场
ball = Furniture('篮球场', 1500)
# 家具太大,剩余面积不足,无法容纳
jia1.add_furniture(ball)
# 查看房屋现状
# 房子坐落于北京, 占地面积1200, 剩余面积1194, 家具有['双人床']
print(jia1)

提示:三块代码,放到一起就可以查看效果了。

posted @ 2022-02-23 10:17  繁华似锦Fighting  阅读(127)  评论(0编辑  收藏  举报