「Python」面向对象封装案例2——摆放家具(需求分析、示例代码)

上一篇文章已经有一个面向对象分装案例了叫“小夏爱跑步”,相对这个摆放家具案例是非常简单的,知识点是回顾初始化方法initstr方法,还有拓展一个知识点——多个的对象属性之间互不干扰。

一、面向对象封装案例——摆放家具需求分析

需求:

1.房子(House)有户型、总面积和家具名称列表

(1)新房子没有任何家具

2. 家具(HouseItem)有名字和占地面积,其中

  • (1) 席梦思(bed)占地4平方米

  • (2) 衣柜(chest)占地2.5平方米

  • (3) 餐桌(table)占地2平方米

3.将以上三件家具添加到房子中

4.打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表

分析:

1662364383455.png

其中添加家具的添加方法应该定义在房子类中,因为房子初始是没有家具的,使用添加家具的方法add_item(self, item)就可以把家具这个参数item对应的家具名称追加到item_list列表,这样每调用一次方法房子中的家具列表中就会多一个家具,因此应该把添加家具的方法定义在房子中。

剩余面积:

1. 在创建房子对象时,定义一个剩余面积的属性,初始值和总面积相等

2. 当调用add_item方法,向房子添加家具时,让剩余面积-=家具面积

思考一个问题:有两个类,应该先开发哪一个类?

答案:家具类

原因:

1. 家具类简单

2. 房子类要使用到家具,被使用的类,通常应该先开发。不然如果先开发房子类,再开发到家具那一块代码时不得终止再转向来开发家具类这种方法不太明智。


二、开发家具类以及创建家具对象

根据上图中家具类可以看出有2个形参,分别是家具名字和占地面积

代码:

class HouseItem:
    # 初始化方法:简化对象的创建
    def __init__(self, name, area):
        # self.属性 = 形参
        self.name = name
        self.area = area

    # 内置方法__str__(self):简化对象的输出
    def __str__(self):
        # 这个方法需要注意必须要返回一个字符串
        # .2f 表示在遇到小数的时候只保留2位小数
        return "[%s] 占地面积是%.2f 平方米" % (self.name, self.area)

# 1. 创建家具对象
bed = HouseItem("席梦思", 4)
chest = HouseItem("衣柜", 2.5)
table = HouseItem("餐桌", 2)

print(bed)
print(chest)
print(table)

执行结果:

图片1.png

三、定义房子类

在上述代码中再添加房子类。看最上面的图,可以看出在房子类中有四个属性,其中房子户型和总面积这两个参数应该由外界传递,而剩余面积free_area怎么办?一个新房子没有任何的家具初始情况下剩余面积就等于总面积,所以剩余面积不需要外界参数传递。第四个参数家具名称列表item_list,新房子一开始没有家具,初始的时候只是一个空列表,所以在准备参数的时候只需要准备两个形参分别是house_type和area。

代码:

class HouseItem:
    # 初始化方法:简化对象的创建
    def __init__(self, name, area):
        # self.属性 = 形参
        self.name = name
        self.area = area

    # 内置方法__str__(self):简化对象的输出
    def __str__(self):
        # 这个方法需要注意必须要返回一个字符串
        # .2f 表示在遇到小数的时候只保留2位小数
        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):

        # python小技巧: Python能够自动的将一对括号内部的代码连接在一起不出错,因为代码过程所以这里用了小括号
        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. 创建家具对象
bed = HouseItem("席梦思", 4)
chest = HouseItem("衣柜", 2.5)
table = HouseItem("餐桌", 2)

print(bed)
print(chest)
print(table)


# 2. 创建房子对象
house1 = House("两室一厅", 80)

# 调用添加方法,把家具都添加到新房子中
house1.add_item(bed)
house1.add_item(chest)
house1.add_item(table)

print(house1)

执行结果:


图片2.png

小结:

1. 创建了一个房子类,使用到initstr这两个内置方法

2. 准备了一个add-item方法准备添加家具

3. 使用房子类创建了一个房子对象

4. 让房子对象调用了三次addd_item方法,将三件家具以实参传递到add_item内部


四、完善代码——添加家具方法

需求:

1. 判断家具的面积是否超过剩余面积,如果超过,提示不能添加这件家具

2. 将家具的名称追加到家具列表中

3. 剩余面积 = 当前的房子剩余面积 - 家具面积(房子剩余面积会随着每添加一个家具发生相应的变化)

** 代码:**

class HouseItem:
    # 初始化方法:简化对象的创建
    def __init__(self, name, area):
        # self.属性 = 形参
        self.name = name
        self.area = area

    # 内置方法__str__(self):简化对象的输出
    def __str__(self):
        # 这个方法需要注意必须要返回一个字符串
        # .2f 表示在遇到小数的时候只保留2位小数
        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):

        # python小技巧: Python能够自动的将一对括号内部的代码连接在一起不出错,因为代码过程所以这里用了小括号
        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  # return关键字可以返回结果也可以不返回结果,下方代码不会被执行

        # 2. 将家具添加到家具列表中
        self.item_list.append(item.name)

        # 3. 计算剩余面积
        self.free_area -= item.area


# 1. 创建家具对象
bed = HouseItem("席梦思", 4)
chest = HouseItem("衣柜", 2.5)
table = HouseItem("餐桌", 2)

print(bed)
print(chest)
print(table)


# 2. 创建房子对象
house1 = House("两室一厅", 80)

# 调用添加方法,把家具都添加到新房子中
house1.add_item(bed)
house1.add_item(chest)
house1.add_item(table)

print(house1)

** 执行结果:**


图片3.png

小结:

1. 主程序只负责创建房子对象和家具对象以及调用方法

2. 让房子对象调用add_item方法将家具添加到房子中

3. 面积计算、剩余面积、家具列表等细节处理都被封装到房子类的内部

以上就是关于面向对象案例摆放家具的分析和代码演练,更多Python练习题可以关注Python自学网,不断更新。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容