引言
python小程序之封装(小明、家具管理)
文章目录
- 引言
- 一、封装(小明)
- 1.1 题目
- 1.2 代码
- 1.3 代码解释
- 二、封装(家具管理)
- 2.1 题目
- 2.2 代码
- 2.3 代码解释
- 2.3.1 类 `HouseItem`
- 2.3.2 类 `House`
- 2.3.3 实例化与调用
- 2.3.4 运行结果
- 四、思考
- 4.1 封装(小明)
- 4.2 封装(家具管理)
一、封装(小明)
1.1 题目
小明体重75公斤,每跑一次步会减0.5公斤,每吃一次东西会重0.7公斤
1.2 代码
class Person:
def __init__(self, name, weight):
self.name = name
self.weight = weight
def __str__(self):
return f'{self.name}的体重是{self.weight}kg'
def run(self):
print(f'{self.name}跑步,体重减少了')
self.weight -= 0.5
def eat(self):
print(f'{self.name}吃东西,体重增加了')
self.weight += 0.7
xiaoming = Person('小明', 75)
print(xiaoming)
xiaoming.run()
print(xiaoming)
输出结果:
1.3 代码解释
这段代码定义了一个名为
Person
的类,用于表示一个人的基本信息和体重变化的行为
class Person:
定义了一个名为Person
的类def __init__(self, name, weight):
定义了类的构造函数,用于在创建Person
对象时初始化其属性。self
代表类的实例本身,name
和weight
是构造函数的参数self.name = name
:将传入的name
参数赋值给实例属性name
self.weight = weight
:将传入的weight
参数赋值给实例属性weight
def __str__(self):
定义了类的字符串表示方法,当使用print()
函数打印Person
对象时,会调用这个方法return f'{self.name}的体重是{self.weight}kg'
:返回一个格式化的字符串,显示人的名字和体重
def run(self):
定义了一个名为run
的方法,用于模拟人跑步时体重减少的行为print(f'{self.name}跑步,体重减少了')
:打印出人跑步的信息self.weight -= 0.5
:将实例属性weight
的值减少 0.5
def eat(self):
定义了一个名为eat
的方法,用于模拟人吃东西时体重增加的行为print(f'{self.name}吃东西,体重增加了')
:打印出人吃东西的信息self.weight += 0.7
:将实例属性weight
的值增加 0.7
xiaoming = Person('小明', 75)
:创建了一个Person
类的实例,名为xiaoming
,其名字为 “小明”,体重为75kgprint(xiaoming)
:打印xiaoming
实例,由于重写了__str__
方法,所以会打印出 “小明的体重是75kg”xiaoming.run()
:调用xiaoming
实例的run
方法,模拟小明跑步,体重减少 0.5kg。print(xiaoming)
:再次打印xiaoming
实例,此时体重变为74.5kg,所以会打印出 “小明的体重是74.5kg”xiaoming.eat()
:调用xiaoming
实例的eat
方法,模拟小明吃东西,体重增加 0.7kgprint(xiaoming)
:再次打印xiaoming
实例,此时体重变为75.2kg,所以会打印出 “小明的体重是75.2kg”
二、封装(家具管理)
2.1 题目
1.房子(House)有户型、总面积和家具名称列表
- 新房子没有任何的家具
2.家具(Houseltem)有名字和占地面积,其中
- 席梦思(bed)占地4平米
- 衣柜(chest)占地2平米
- 餐桌(table)占地1.5平米
3.将以上三件家具添加到房子中
4.打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表剩余面积:
- 1.在创建房子对象时,定义一个剩余面积的属性,初始值和总面积相等
- 2.当调用add_item方法,向房间添加家具时,让剩余面积-=家具面积
2.2 代码
class House:
def __init__(self, htype, tarea):
self.htype = htype
self.tarea = tarea
self.rarea = tarea
self.list_item = []
def __str__(self):
return f'户型:{self.htype},总面积:{self.tarea}平米,剩余面积:{self.rarea}平米,家具列表:{self.list_item}'
def add_item(self, item):
if self.rarea >= item.area:
self.list_item.append(item.name)
print(f'房子里添加了{item.name},剩余面积减少了')
self.rarea -= item.area
else:
print("家里空间不够了,放不下了")
class HouseItem:
def __init__(self, name, area):
self.name = name
self.area = area
def __str__(self):
return f'名字:{self.name},占地面积:{self.area}平米'
bad = HouseItem('席梦思', 4)
# print(bad)
chest = HouseItem('衣柜', 2)
# print(chest)
table = HouseItem('餐桌', 1.5)
# print(table)
home = House('四叶草户型', 7)
home.add_item(bad)
print(home)
home.add_item(chest)
print(home)
home.add_item(table)
print(home)
输出结果:
2.3 代码解释
这段代码定义了两个类:
House
和HouseItem
。它们分别用来表示房子和家具
2.3.1 类 HouseItem
- 属性:
name
: 家具的名字area
: 家具占用的面积
- 方法:
__init__(self, name, area)
: 构造函数,用于初始化一个新的HouseItem
对象__str__(self)
: 返回一个描述该对象的字符串
2.3.2 类 House
- 属性:
htype
: 房子的户型tarea
: 房子的总面积rarea
: 房子剩余可使用的面积,初始时等于总面积list_item
: 存储已添加到房子里的家具名字列表
- 方法:
__init__(self, htype, tarea)
: 构造函数,用于初始化一个新的House
对象__str__(self)
: 返回一个描述该房子状态的字符串,包括户型、总面积、剩余面积以及家具列表add_item(self, item)
: 尝试将给定的HouseItem
添加到房子中。如果房子有足够的空间(即rarea
大于或等于item.area
),则更新rarea
并将家具名称添加到list_item
中;否则,打印出空间不足的消息
2.3.3 实例化与调用
- 创建了三个
HouseItem
对象:bad
(席梦思),chest
(衣柜),table
(餐桌) - 创建了一个
House
对象home
,其户型为“四叶草户型”,总面积为 7 平米 - 使用
home.add_item()
方法尝试向home
添加家具,并在每次添加后打印当前的房子状态
2.3.4 运行结果
- 当第一次尝试添加
bad
(席梦思) 时,由于它的面积是 4 平米,小于home
的剩余面积 7 平米,所以可以成功添加。这时,home
的剩余面积减少到 3 平米 - 接着添加
chest
(衣柜),面积为 2 平米,仍然小于home
的剩余面积 3 平米,因此也可以成功添加。此时,home
的剩余面积变为 1 平米 - 最后尝试添加
table
(餐桌),面积为 1.5 平米,但是home
的剩余面积只有 1 平米,不足以容纳这张餐桌,因此会输出“家里空间不够了,放不下了”
通过这个简单的程序,我们可以看到如何使用面向对象的方法来模拟现实世界中的情况,比如管理房屋内的家具布局
四、思考
4.1 封装(小明)
- __init__初始化基本信息
- __str__加上实例的print输出信息
- run和eat方法变更weight变量
- 最终达到记录体重变更的目的
4.2 封装(家具管理)
- House和HouseItem类有各自的属性和方法
- House类需要HouseItem类中的数据,就需要在House中初始化一个空列表
- 添加家具方法add_item首先要判断能否添置家具,其次对家具列表、剩余面积进行更新