Python面向对象封装操作案例详解


Posted in Python onDecember 31, 2019

本文实例讲述了Python面向对象封装操作。分享给大家供大家参考,具体如下:

目标

封装
小明爱跑步
存放家具

01. 封装

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

02. 小明爱跑步

需求

小明 体重 75.0 公斤
小明每次 跑步 会减肥 0.5 公斤
小明每次 吃东西 体重增加 1 公斤
Python面向对象封装操作案例详解
提示:在 对象的方法内部,是可以 直接访问对象的属性 的!

代码实现:

class Person:
  """人类"""

  def __init__(self, name, weight):

    self.name = name
    self.weight = weight

  def __str__(self):

    return "我的名字叫 %s 体重 %.2f 公斤" % (self.name, self.weight)

  def run(self):
    """跑步"""

    print("%s 爱跑步,跑步锻炼身体" % self.name)
    self.weight -= 0.5

  def eat(self):
    """吃东西"""

    print("%s 是吃货,吃完这顿再减肥" % self.name)
    self.weight += 1


xiaoming = Person("小明", 75)

xiaoming.run()
xiaoming.eat()
xiaoming.eat()

print(xiaoming)

2.1 小明爱跑步扩展 —— 小美也爱跑步

需求

小明 和 小美 都爱跑步
小明 体重 75.0 公斤
小美 体重 45.0 公斤
每次 跑步 都会减少 0.5 公斤
每次 吃东西 都会增加 1 公斤
Python面向对象封装操作案例详解
提示

在 对象的方法内部,是可以 直接访问对象的属性 的
同一个类 创建的 多个对象 之间,属性 互不干扰!
Python面向对象封装操作案例详解

03. 摆放家具

需求

房子(House) 有 户型、总面积 和 家具名称列表
新房子没有任何的家具
家具(HouseItem) 有 名字 和 占地面积,其中
席梦思(bed) 占地 4 平米
衣柜(chest) 占地 2 平米
餐桌(table) 占地 1.5 平米
将以上三件 家具 添加 到 房子 中
打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表
Python面向对象封装操作案例详解
剩余面积

在创建房子对象时,定义一个 剩余面积的属性,初始值和总面积相等
当调用 add_item 方法,向房间 添加家具 时,让 剩余面积 -= 家具面积
思考:应该先开发哪一个类?

答案 —— 家具类

家具简单
房子要使用到家具,被使用的类,通常应该先开发

3.1 创建家具

class HouseItem:

  def __init__(self, name, area):
    """

    :param name: 家具名称
    :param area: 占地面积
    """
    self.name = name
    self.area = area

  def __str__(self):
    return "[%s] 占地面积 %.2f" % (self.name, self.area)


# 1. 创建家具
bed = HouseItem("席梦思", 4)
chest = HouseItem("衣柜", 2)
table = HouseItem("餐桌", 1.5)

print(bed)
print(chest)
print(table)

小结

创建了一个 家具类,使用到 initstr 两个内置方法
使用 家具类 创建了 三个家具对象,并且 输出家具信息

3.2 创建房间

class House:

  def __init__(self, house_type, area):
    """

    :param house_type: 户型
    :param area: 总面积
    """
    self.house_type = house_type
    self.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)

...

# 2. 创建房子对象
my_home = House("两室一厅", 60)

my_home.add_item(bed)
my_home.add_item(chest)
my_home.add_item(table)

print(my_home)

小结

创建了一个 房子类,使用到 initstr 两个内置方法
准备了一个 add_item 方法 准备添加家具
使用 房子类 创建了 一个房子对象
让 房子对象 调用了三次 add_item 方法,将 三件家具 以实参传递到 add_item 内部

3.3 添加家具

需求

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

def add_item(self, item):

    print("要添加 %s" % item)
    # 1. 判断家具面积是否大于剩余面积
    if item.area > self.free_area:
      print("%s 的面积太大,不能添加到房子中" % item.name)

      return

    # 2. 将家具的名称追加到名称列表中
    self.item_list.append(item.name)

    # 3. 计算剩余面积
    self.free_area -= item.area

3.4 小结

主程序只负责创建 房子 对象和 家具 对象
让 房子 对象调用 add_item 方法 将家具添加到房子中
面积计算、剩余面积、家具列表 等处理都被 封装 到 房子类的内部

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python开发之基于thread线程搜索本地文件的方法
Nov 11 Python
使用python实现tcp自动重连
Jul 02 Python
python通过百度地图API获取某地址的经纬度详解
Jan 28 Python
详解DeBug Python神级工具PySnooper
Jul 03 Python
python爬虫神器Pyppeteer入门及使用
Jul 13 Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 Python
简单易懂Pytorch实战实例VGG深度网络
Aug 27 Python
Win10+GPU版Pytorch1.1安装的安装步骤
Sep 27 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
Oct 23 Python
Python定时从Mysql提取数据存入Redis的实现
May 03 Python
python数据类型强制转换实例详解
Jun 22 Python
Python 求向量的余弦值操作
Mar 04 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
Dec 31 #Python
Python面向对象之私有属性和私有方法应用案例分析
Dec 31 #Python
Pycharm最新激活码2019(推荐)
Dec 31 #Python
python ftplib模块使用代码实例
Dec 31 #Python
深入了解如何基于Python读写Kafka
Dec 31 #Python
Python面向对象之继承原理与用法案例分析
Dec 31 #Python
pytorch中nn.Conv1d的用法详解
Dec 31 #Python
You might like
PHP取进制余数函数代码
2012/01/19 PHP
利用php下载xls文件(自己动手写的)
2014/04/18 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
2015/12/17 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
jQuery EasyUI 中文API Button使用实例
2010/04/14 Javascript
jquery获取焦点和失去焦点事件代码
2013/04/21 Javascript
跟我学Nodejs(三)--- Node.js模块
2014/05/25 NodeJs
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
2017/02/26 Javascript
浅谈ES6新增的数组方法和对象
2017/08/08 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
详解Chai.js断言库API中文文档
2018/01/31 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
JS中队列和双端队列实现及应用详解
2020/09/29 Javascript
Python开发微信公众平台的方法详解【基于weixin-knife】
2017/07/08 Python
pandas按若干个列的组合条件筛选数据的方法
2018/04/11 Python
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
对python 读取线的shp文件实例详解
2018/12/22 Python
Python操作MySQL数据库的示例代码
2020/07/13 Python
python使用requests库爬取拉勾网招聘信息的实现
2020/11/20 Python
使用Canvas操作像素的方法
2018/06/14 HTML / CSS
详解HTML5 data-* 自定义属性
2018/01/24 HTML / CSS
台湾三立电视电商平台:电电购
2019/09/09 全球购物
Java的接口和C++的虚类的相同和不同处
2014/03/27 面试题
叙述DBMS对数据控制功能有哪些
2016/06/12 面试题
高级电工工作职责
2013/11/21 职场文书
教育局长自荐信范文
2013/12/22 职场文书
安全生产实施方案
2014/02/23 职场文书
创文明城市标语
2014/06/16 职场文书
庐山导游词
2015/02/03 职场文书
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
2022/08/14 Servers