本文主要是介绍第十二天Python之面向对象封装案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目标
- 封装
- 小明爱跑步
- 存放家具
一、封装
- 封装 是面向对象编程的一大特点
- 面向对象编程的 第一步 ——将 属性 和 方法 封装 到一个抽象的 类 中
- 外界 使用 类 创建 对象 ,然后 让对象调用方法
- 对象方法的细节 都被 封装 在 类的内部
二、小明爱跑步
需求
- 小明 体重 75.0 公斤
- 小明每次 跑步 会减肥 0.5 公斤
- 小明每次 吃东西 体重增加 1 公斤
提示:在对象的方法内部,是可以直接访问对象的属性的!
- 代码实现:
class Person:def __init__(self, name, weight):# self.属性 = 形参self.name = nameself.weight = weightdef __str__(self):return "我的名字叫 %s 体重是 %.2f 公斤" % (self.name, self.weight)def run(self):print("%s 爱跑步,跑步锻炼身体" % self.name)self.weight -= 0.5def eat(self):print("%s 是吃货,吃完这顿再减肥" % self.name)self.weight += 1xiaoming = Person("小明", 75.0)xiaoming.run()
xiaoming.eat()print(xiaoming)
1. 小明爱跑步扩展——小美也爱跑步
需求
- 小明 和 小美 都爱跑步
- 小明 体重 75.0 公斤
- 小美 体重 45.0 公斤
- 每次 跑步 都会减少 0.5 公斤
- 每次吃东西都会增加 1 公斤
提示
- 在对象的方法内部,是可以 直接访问对象的属性 的
- 同一个类 创建的 多个对象之间, 属性 互不干扰!
三、摆放家具
需求
- 房子(House) 有 户型、总面积 和 家具名称列表
- 新房子没有任何家具 - 家具(HouseItem) 有 名字 和 占地面积 ,其中:
- 席梦思(bed) 占地 4 平米
- 衣柜(chest) 占地 2 平米
- 餐桌(table) 占地 1.5 平米 - 将以上三件 家具 添加 到 房子 中
- 打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表
剩余面积
- 在创建房子对象时,定义一个 剩余面积的属性,初始值和总面积相等
- 当调用 add_item 方法,向房间 添加家具 时,让 剩余面积 -= 家具面积
思考: 应该先开发哪一个类?
答案——家具类
- 家具简单
- 房子要是用到家具,被使用的类, 通常应该先开发
class HouseItem:def __init__(self, name, area):self.name = nameself.area = areadef __str__(self):return "[%s] 占地 %.2f" % (self.name, self.area)class House:def __init__(self, house_type, area):self.house_type = house_typeself.area = area# 剩余面积self.free_area = area# 家具名称列表self.item_list = []def __str__(self):# 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)
table = HouseItem("餐桌", 1.5)print(bed)
print(chest)
print(table)# 2. 创建房子对象
my_home = House("两室一厅", 60)my_home.add_item(bed)
my_home.add_item(chest)
my_home.add_item(table)print(my_home)
小结
- 创建了一个 房子类 ,是用到 __ init __ 和 __ str __ 两个内置方法
- 准备了一个 add_item 方法 准备添加家具
- 使用 房子类 创建了 一个房子对象
3. 添加家具
需求
- 1> 判断 家具的面积 是否 超过剩余面积,如果超过,提示不能添加这件家具
- 2> 将 家具的名称 追加到 家具名称列表 中
- 3> 用 房子的剩余面积 - 家具面积
面向对象封装案例 II
目标
- 士兵突击案例
- 身份运算符
封装
- 封装 是面向对象编程的一大特点
- 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中
- 外界 使用 类 创建 对象 ,然后 让对象调用方法
- 对象方法的细节 都被 封装 在 类的内部
一个对象的 属性 可以是另外一个类创建的对象
一、士兵突击
需求
- 士兵 许三多 有一把 AK47
- 士兵 可以 开火
- 枪 能够 发射 子弹
- 枪 装填 装填子弹 —— 增加子弹数量
1. 开发枪类
class Gun:def __init__(self, model):# 1. 枪的型号self.model = model# 2. 子弹的数量self.bulle_count = 0def add_bullet(self,count):self.bulle_count += countdef shoot(self):# 1. 判断子弹数量if self.bulle_count <= 0:print("[%s] 没有子弹了..." % self.model)return# 2. 发射子弹, -1self.bulle_count -= 1# 3. 提示发射信息print("[%s] 突突突...[%d]" % (self.model, self.bulle_count))# 1. 创建枪对象
ak47 = Gun("AK47")ak47.add_bullet(50)
ak47.shoot()
2. 开发士兵类
假设:每一个新兵 都 没有枪
定义没有初始值的属性
在定义属性时,如果 不知道设置什么初始值, 可以设置为 None
- None 关键字 表示 什么都没有
- 表示一个 空对象,没有方法和属性,是一个特殊的常量
- 可以将 None 赋值给任何一个变量
fire 方法需求
- 1> 判断是否有枪,没有枪没法冲锋
- 2> 喊一声口号
- 3> 装填子弹
- 4> 射击
class Gun:def __init__(self, model):# 1. 枪的型号self.model = model# 2. 子弹的数量self.bulle_count = 0def add_bullet(self,count):self.bulle_count += countdef shoot(self):# 1. 判断子弹数量if self.bulle_count <= 0:print("[%s] 没有子弹了..." % self.model)return# 2. 发射子弹, -1self.bulle_count -= 1# 3. 提示发射信息print("[%s] 突突突...[%d]" % (self.model, self.bulle_count))class Solider:def __init__(self, name):# 1. 姓名self.name = name# 2. 枪 - 新兵没有枪self.gun = Nonedef fire(self):# 1. 判断士兵是否有枪if self.gun == None:print("[%s] 还没有枪" % self.name)return# 2. 高喊口号print("冲啊...[%s]" % self.name)# 3. 让枪装填子弹self.gun.add_bullet(50)# 4. 让枪发射子弹self.gun.shoot()# 1. 创建枪对象
ak47 = Gun("AK47")ak47.add_bullet(50)
ak47.shoot()# 2. 创建许三多
xusanduo = Solider("许三多")xusanduo.gun = ak47
xusanduo.fire()print(xusanduo.gun)
小结
- 创建了一个 士兵类 ,使用到 __ init __ 内置方法
- 在定义属性时,如果 不知道设置什么初始值,可以设置为 None
- 在 封装的 方法内部,还可以让 自己的 使用其他类创建的对象属性 调用已经 封装好的方法
二、身份运算符
身份运算符用于 比较 两个对象的 内存地址 是否一致 —— 是否是对同一个对象的引用
- 在 Python 中针对 None 比较时,建议使用 is 判断
运算符 | 描述 | 实例 |
---|---|---|
is | is 是判断两个标识符是不是引用同一个对象 | x is y , 类似 id(x) == id(y) |
is not | is not 是判断两个标识符是不是引用不同对象 | x is not y ,类似 id(a)! = id(b) |
is 与 == 区别
is 用于判断 两个变量 引用对象是否为同一个
== 用于判断 引用变量的值 是否相等
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> b is a
False
>>> b == a
True
这篇关于第十二天Python之面向对象封装案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!