上一篇文章曾经有一个面向对象分装案例了叫“小夏爱跑步”,绝对这个摆放家具案例是非常简单的,知识点是回顾初始化办法__init__和__str__办法,还有拓展一个知识点——多个的对象属性之间互不烦扰。
一、面向对象封装案例——摆放家具需要剖析
需要:
1. 房子(House)有户型、总面积和家具名称列表
(1)新房子没有任何家具
- 家具(HouseItem)有名字和占地面积,其中
(1) 席梦思(bed)占地 4 平方米
(2) 衣柜(chest)占地 2.5 平方米
(3) 餐桌(table)占地 2 平方米
3. 将以上三件家具增加到房子中
4. 打印房子时,要求输入:户型、总面积、残余面积、家具名称列表
剖析:
其中增加家具的增加办法应该定义在房子类中,因为房子初始是没有家具的,应用增加家具的办法 add_item(self, item)就能够把家具这个参数 item 对应的家具名称追加到 item_list 列表,这样每调用一次办法房子中的家具列表中就会多一个家具,因而应该把增加家具的办法定义在房子中。
残余面积:
- 在创立房子对象时,定义一个残余面积的属性,初始值和总面积相等
- 当调用 add_item 办法,向房子增加家具时,让残余面积 -= 家具面积
思考一个问题:有两个类,应该先开发哪一个类?
答案:家具类
起因:
- 家具类简略
- 房子类要应用到家具,被应用的类,通常应该先开发。不然如果先开发房子类,再开发到家具那一块代码时不得终止再转向来开发家具类这种办法不太理智。
二、开发家具类以及创立家具对象
依据上图中家具类能够看出有 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)
执行后果:
三、定义房子类
在上述代码中再增加房子类。看最下面的图,能够看出在房子类中有四个属性,其中房子户型和总面积这两个参数应该由外界传递,而残余面积 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)
执行后果:
小结:
1. 创立了一个房子类,应用到__init___和_str__这两个内置办法
2. 筹备了一个 add-item 办法筹备增加家具
3. 应用房子类创立了一个房子对象
4. 让房子对象调用了三次 addd_item 办法,将三件家具以实参传递到 add_item 外部
四、欠缺代码——增加家具办法
需要:
- 判断家具的面积是否超过残余面积,如果超过,提醒不能增加这件家具
- 将家具的名称追加到家具列表中
- 残余面积 = 以后的房子残余面积 – 家具面积(房子残余面积会随着每增加一个家具产生相应的变动)
代码:
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)
执行后果:
小结:
1. 主程序只负责创立房子对象和家具对象以及调用办法
2. 让房子对象调用 add_item 办法将家具增加到房子中
3. 面积计算、残余面积、家具列表等细节解决都被封装到房子类的外部
以上就是对于面向对象案例摆放家具的剖析和代码演练,更多 Python 练习题能够关注Python 自学网,不断更新。www.wakey.com.cn/