目录

Python面向对象(2)两个案例

Python面向对象(2)两个案例

学习目标

  • 烤地瓜
  • 搬家具

烤地瓜

  • 需求分析
  • 步骤分析
  • 代码实现

需求分析

需求主线:

  1. 被烤的时间和对应的地瓜状态:烤0-3分钟——生的,烤3-5分钟——半生不熟,烤5-8分钟——熟了,烤超过8分钟——烤糊
  2. 添加的调料:用户可以按自己的意愿添加调料。

步骤分析

需求涉及到一个事物就是地瓜,所以本案例涉及一个类:地瓜类。

定义类

  • 地瓜的属性:

    • 被烤的时间
    • 地瓜的状态
    • 添加的调料
  • 地瓜的方法:

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

初始代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class SweetPatato():
    def __init__(self):
        self.cook_time = 0
        self.cook_status = '生的'
        self.conditions = []

    def cook(self, time):
        self.cook_time += time
        if 0 <= self.cook_time < 3:
            self.cook_status = '生的'
        elif 3 <= self.cook_time < 5:
            self.cook_status = '半生不熟'
        elif 5 <= self.cook_time < 8:
            self.cook_status = '熟了'
        elif self.cook_time >= 8:
            self.cook_status = '烤糊'

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

digua1 = SweetPatato()
print(digua1)   # 这个地瓜烤了0分钟,地瓜状态是生的
digua1.cook(2)
print(digua1)   # 这个地瓜烤了2分钟,地瓜状态是生的
digua1.cook(2)
print(digua1)   # 这个地瓜烤了4分钟,地瓜状态是半生不熟
digua1.cook(2)
print(digua1)   # 这个地瓜烤了6分钟,地瓜状态是熟了
digua1.cook(2)
print(digua1)   # 这个地瓜烤了8分钟,地瓜状态是烤糊

对象调用cook方法传入的2会添加到初始化变量中

代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class SweetPatato():
    def __init__(self):
        self.cook_time = 0
        self.cook_status = '生的'
        self.condiments = []

    def cook(self, time):
        self.cook_time += time
        if 0 <= self.cook_time < 3:
            self.cook_status = '生的'
        elif 3 <= self.cook_time < 5:
            self.cook_status = '半生不熟'
        elif 5 <= self.cook_time < 8:
            self.cook_status = '熟了'
        elif self.cook_time >= 8:
            self.cook_status = '烤糊'

    def __str__(self):
        return f'这个地瓜烤了{self.cook_time}分钟,' \
               f'地瓜状态是{self.cook_status},调料有{self.condiments}'
        
    def add_condiments(self,condiments):
        self.condiments.append(condiments)
digua1 = SweetPatato()
digua1.add_condiments('辣椒面')
digua1.cook(2)
print(digua1)   # 这个地瓜烤了2分钟,地瓜状态是生的,调料有['辣椒面']
digua1.add_condiments('酱油')
digua1.cook(2)
print(digua1)   # 这个地瓜烤了4分钟,地瓜状态是半生不熟,调料有['辣椒面', '酱油']
digua1.add_condiments('蕃茄酱')
digua1.cook(2)
print(digua1)   # 这个地瓜烤了6分钟,地瓜状态是熟了,调料有['辣椒面', '酱油', '蕃茄酱']
digua1.cook(2)
print(digua1)   # 这个地瓜烤了8分钟,地瓜状态是烤糊,调料有['辣椒面', '酱油', '蕃茄酱']

搬家具

  • 需求分析
  • 步骤分析
  • 代码实现

需求分析

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

步骤分析

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

定义类

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

代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class Furniture():  # 家具类
    def __init__(self, name, area):
        self.name = name    # 家具名字
        self.area = area    # 家具面积


class Home():
    def __init__(self,address,area):
        self.address = address
        self.area = area
        self.free_area = area
        self.furnitures = []

    def __str__(self):
        return f'房子坐落在{self.address},' \
               f'占地面积为{self.area},剩余面积为{self.free_area},' \
               f'家具列表有{self.furnitures}'

    def add_funiture(self, item):   # item接受对象
        """
        容纳家具
        :param item:传入的家具
        :return:
        """
        if self.free_area >= item.area:
            self.furnitures.append(item.name)
            self.free_area -= item.area
        else:
            print("家具太大,剩余面积不足,无法容纳")
# 先登记一下家具
sofa = Furniture('沙发',20)
desk = Furniture('桌子',10)
bed1 = Furniture('床1', 30)
bed2 = Furniture('床2', 30)

myhome = Home('火星',99)
# 开始搬家具啦
myhome.add_funiture(sofa)   # 搬沙发进去
print(myhome)   # 房子坐落在火星,占地面积为99,剩余面积为79,家具列表有['沙发']
myhome.add_funiture(desk)   # 搬桌子进去
print(myhome)   # 房子坐落在火星,占地面积为99,剩余面积为69,家具列表有['沙发', '桌子']
myhome.add_funiture(bed1)    # 搬床进去
print(myhome)   # 房子坐落在火星,占地面积为99,剩余面积为39,家具列表有['沙发', '桌子', '床1']
myhome.add_funiture(bed2)
print(myhome) # 房子坐落在火星,占地面积为99,剩余面积为9,家具列表有['沙发', '桌子', '床1', '床2']
myhome.add_funiture(desk)
print(myhome) # 家具太大,剩余面积不足,无法容纳 
# 房子坐落在火星,占地面积为99,剩余面积为9,家具列表有['沙发', '桌子', '床1', '床2']

总结

  • 面向对象重要组成部分:类和对象
  • 类有属性和方法,对象可以调用其属性和方法。
  • 类来实例化对象,__init__()魔法方法来设置初始化的属性,可以设置参数动态更改属性。
  • __init__()魔法方法是不需要调用的,自动调用。