第十二天Python之面向对象封装案例

2024-02-21 01:38

本文主要是介绍第十二天Python之面向对象封装案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目标

  • 封装
  • 小明爱跑步
  • 存放家具

一、封装

  1. 封装 是面向对象编程的一大特点
  2. 面向对象编程的 第一步 ——将 属性方法 封装 到一个抽象的
  3. 外界 使用 创建 对象 ,然后 让对象调用方法
  4. 对象方法的细节 都被 封装类的内部

二、小明爱跑步

需求

  1. 小明 体重 75.0 公斤
  2. 小明每次 跑步 会减肥 0.5 公斤
  3. 小明每次 吃东西 体重增加 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. 小明爱跑步扩展——小美也爱跑步

需求

  1. 小明小美 都爱跑步
  2. 小明 体重 75.0 公斤
  3. 小美 体重 45.0 公斤
  4. 每次 跑步 都会减少 0.5 公斤
  5. 每次吃东西都会增加 1 公斤

在这里插入图片描述

提示

  1. 对象的方法内部,是可以 直接访问对象的属性
  2. 同一个类 创建的 多个对象之间属性 互不干扰!
    在这里插入图片描述
    三、摆放家具

需求

  1. 房子(House)户型、总面积家具名称列表
    - 新房子没有任何家具
  2. 家具(HouseItem)名字占地面积 ,其中:
    - 席梦思(bed) 占地 4 平米
    - 衣柜(chest) 占地 2 平米
    - 餐桌(table) 占地 1.5 平米
  3. 将以上三件 家具 添加房子
  4. 打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表
    在这里插入图片描述

剩余面积

  1. 在创建房子对象时,定义一个 剩余面积的属性,初始值和总面积相等
  2. 当调用 add_item 方法,向房间 添加家具 时,让 剩余面积 -= 家具面积

思考: 应该先开发哪一个类?

答案——家具类

  1. 家具简单
  2. 房子要是用到家具,被使用的类, 通常应该先开发
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)

小结

  1. 创建了一个 房子类 ,是用到 __ init __ 和 __ str __ 两个内置方法
  2. 准备了一个 add_item 方法 准备添加家具
  3. 使用 房子类 创建了 一个房子对象

3. 添加家具

需求

  • 1> 判断 家具的面积 是否 超过剩余面积,如果超过,提示不能添加这件家具
  • 2> 将 家具的名称 追加到 家具名称列表
  • 3> 用 房子的剩余面积 - 家具面积

面向对象封装案例 II

目标

  • 士兵突击案例
  • 身份运算符

封装

  1. 封装 是面向对象编程的一大特点
  2. 面向对象编程的 第一步 —— 将 属性方法 封装 到一个抽象的
  3. 外界 使用 创建 对象 ,然后 让对象调用方法
  4. 对象方法的细节 都被 封装类的内部

一个对象的 属性 可以是另外一个类创建的对象

一、士兵突击
需求

  1. 士兵 许三多 有一把 AK47
  2. 士兵 可以 开火
  3. 能够 发射 子弹
  4. 装填 装填子弹 —— 增加子弹数量
    在这里插入图片描述

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)

小结

  1. 创建了一个 士兵类 ,使用到 __ init __ 内置方法
  2. 在定义属性时,如果 不知道设置什么初始值,可以设置为 None
  3. 封装的 方法内部,还可以让 自己的 使用其他类创建的对象属性 调用已经 封装好的方法

二、身份运算符

身份运算符用于 比较 两个对象的 内存地址 是否一致 —— 是否是对同一个对象的引用

  • 在 Python 中针对 None 比较时,建议使用 is 判断
运算符描述实例
isis 是判断两个标识符是不是引用同一个对象x is y , 类似 id(x) == id(y)
is notis 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之面向对象封装案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/730195

相关文章

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我