当前位置: 首页 > news >正文

「Python」面向对象封装案例1——小夏爱跑步、案例扩展

一、了解面向对象的封装

封装是面向对象编程的一大特性,当我们面向对象编程的时候第一步就是先做需求分析然后根据明确的职责将不同的属性和方法封装到一个又一个抽象的类中。之所以说是抽象的类,因为在开发程序中类是不能直接使用的,当定义好一个类之后,在外界也就是类的代码外部来使用类创建对象,然后再让这个对象去调用我们封装在类中的各个方法。

强调一点:对象方法的细节都是被封装在类的内部的,在外界只需要使用类创建对象,然后让对象调用方法。

总结:

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

二、封装案例——小夏爱跑步

2.1 需求分析

需求:

  1. 小夏体重55.5公斤
  2. 小夏每次跑步会减体重0.5公斤
  3. 小夏每次吃东西体重会增加1公斤

Person

name

weight

__init__(self, name, weight)

__str__(self)

run(self)

eat(self)

当看到需求后,应该用名词提炼法把需求中的名词提炼出。在需求中可以看出有个叫小夏的人类,那么可以定义一个叫做Person的类,在这类中然后看出这个人类的其他属性特征,比如名字和体重分别用name和weight来记录。以上是需求中的名词属性接下来看需求中的动词,不难看出跑步和吃东西是动词,那么在类中定义两个方法,一个run(self)一个eat(self)。再看需求,跑步和吃饭都会影响到体重这个属性,每次跑步会减体重0.5公斤,每次吃东西体重会增加1公斤。

这个案例主要复习之前的__init__初始化方法,利用这个初始化方法来简化对象的创建,同时复习一下__str__这个内置方法,通过这个方法来简化一下小夏对象的输出。

2.2 代码

下图是完成了一大半的代码,剩下两个方法没有完成,目前用pass占位符代替,只是先看看代码总体有没有出错,是否可以正常运行,结果显示时没问题的。接下来在写类中具体的两个方法。

 

完整代码:

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

    # 内置方法__str__(self):简化对象的输出
    def __str__(self):
        # 这个方法需要注意必须要返回一个字符串
        # .2f 表示在遇到小数的时候只保留2位小数
        return "我的名字叫 %s 体重是%.2f 公斤" % (self.name, self.weight)

    def run(self):
        print("%s 爱跑步,跑步可以锻炼身体也可以减肥" % self.name)

        # 每次跑步体重减少0.5公斤
        self.weight -= 0.5

    def eat(self):
        print("%s 爱吃,是个吃货" % self.name)

        # 每次吃东西体重增加1公斤
        self.weight += 1


# 创建小夏对象
xiaoxia = Person("小夏", 55.5)

xiaoxia.run()
xiaoxia.eat()

print(xiaoxia)

运行结果:

 

代码总结:

 

上图中折叠了Person类,在类的外部创建了叫小夏的对象,在对象中传入参数名字和体重,然后对象去调用在类中的两个方法,最后输出这个对象。

提示:在对象的方法内部是可以直接访问对象的属性的。

如下图:在案例中不仅输出了小夏的名字还同时修改了小夏的体重

 

三、案例扩展——多个对象之间属性互不干扰

小夏爱跑步扩展之小菜也爱跑步。

需求:

  1. 小夏爱跑步,小菜也爱跑步
  2. 小夏体重55.5公斤
  3. 小菜体重60公斤
  4. 每次跑步都会减少0.5公斤
  5. 每次吃东西都会增加1公斤

Person

name

weight

__init__(self, name, weight)

__str__(self)

run(self)

eat(self)

3.1需求分析

分析:

分别有小夏和小菜两个人物,可以看做是两个对象,他们各自都有各自的体重。同样可以使用一个Person类,在这个类中定义两个属性,一个name,一个 weight。体重每次跑步和吃东西都会变化,这2个方法的描述是完全一样的意味着在类中分装的2个代码具体的代码实现也是完全相同的,只是在这两个方法执行过程中各自修改不同对象的体重属性。代码是一样的,但是修改的属性是根据调用的对象不同而不同。

3.2代码

只是在上面的代码中创建一个小菜对象,小菜对象再去调用跑步和吃东西的方法,左后输出小菜这个对象。

提示:同一个类创建的多个对象之间,属性互不干扰。

具体代码如下图:

 

结果分析:

运行完小菜对象的代码后可以看出并不会影响到小夏的体重变化,这个因为代码在运行的过程中,在28行先在内存中开辟一个空间来存储小夏对象的两个属性一个名字一个体重,再执行下面两个方法,最后输出小夏对象。然后运行到36行代码创建小菜对象,在内存中同样开辟另外一个空间分别存储name和weight,执行两个方法,最后输出小菜对象。在这一列过程中,两个对象之间的属性并没有被互相干扰到。

 

面向对象编程中使用同一个类可以创建出不同的对象,根据实际的场景每一个对象的属性会各自发生变化,但是多个对象之间属性彼此是互不干扰的。

以上就是关于面向对象案例的一个小小分析和代码演练,更多Python编程题可以关注Python自学网,不断更新。

相关文章:

  • java专家系统房产营销智能推荐系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  • 面向对象是面试时提问最多的吗?
  • HTML5和CSS3四属性总结一
  • paddlepaddle 复现论文LeNet-5网络结构(仅仅关注模型)
  • 查询出跨4个表以上的查询
  • 罗马数字转整数(13)题解
  • STC单片机RAM在KEIL编程使用
  • Git的版本控制(查看文件内容和文件的变化状态、版本日志、版本回退以及找回覆盖的版本等)
  • ijkplayer源码分析 —— 事件消息设计
  • 水文科技新仪器——地埋式积水探测器
  • Jackson ImmunoResearch通过 SDS-PAGE 进行蛋白质分离
  • FLUME 安装配置及使用示例
  • 高等教育心理学:学生的个性与社会性的发展
  • Web前端:Angular的优缺点以及何时使用Angular?
  • Redis基础与高可用集群架构进阶详解
  • (三)从jvm层面了解线程的启动和停止
  • Angularjs之国际化
  • CSS相对定位
  • Go 语言编译器的 //go: 详解
  • JavaScript实现分页效果
  • Laravel 实践之路: 数据库迁移与数据填充
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • October CMS - 快速入门 9 Images And Galleries
  • Spring Cloud中负载均衡器概览
  • vue-loader 源码解析系列之 selector
  • 阿里云应用高可用服务公测发布
  • 多线程事务回滚
  • 番外篇1:在Windows环境下安装JDK
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 简单实现一个textarea自适应高度
  • 设计模式走一遍---观察者模式
  • 通过几道题目学习二叉搜索树
  • 自动记录MySQL慢查询快照脚本
  • NLPIR智能语义技术让大数据挖掘更简单
  • python最赚钱的4个方向,你最心动的是哪个?
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (2020)Java后端开发----(面试题和笔试题)
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (一)Dubbo快速入门、介绍、使用
  • (一)Neo4j下载安装以及初次使用
  • (转)母版页和相对路径
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .net FrameWork简介,数组,枚举
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • :O)修改linux硬件时间
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [Angular] 笔记 18:Angular Router