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抓取框架 Scrapy的架构
Aug 12 Python
利用pyinstaller或virtualenv将python程序打包详解
Mar 22 Python
Python中.py文件打包成exe可执行文件详解
Mar 22 Python
详解appium+python 启动一个app步骤
Dec 20 Python
wxPython实现窗口用图片做背景
Apr 25 Python
Python3中详解fabfile的编写
Jun 24 Python
Python实现两个list求交集,并集,差集的方法示例
Aug 02 Python
使用Pyhton集合set()实现成果查漏的例子
Nov 24 Python
Python魔法方法 容器部方法详解
Jan 02 Python
conda安装tensorflow和conda常用命令小结
Feb 20 Python
如何利用python和DOS获取wifi密码
Mar 31 Python
在Python中如何使用yield
Jun 07 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中的生成XML文件的4种方法分享
2012/10/06 PHP
yii框架通过控制台命令创建定时任务示例
2014/04/30 PHP
PHP字符串比较函数strcmp()和strcasecmp()使用总结
2014/11/19 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
php面向对象程序设计中self与static的区别分析
2019/05/21 PHP
windows系统下简单nodejs安装及环境配置
2013/01/08 NodeJs
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
2013/06/29 Javascript
让IE8浏览器支持function.bind()方法
2014/10/16 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
js获取Get值的方法
2016/09/29 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
详解JavaScript中this的指向问题
2017/01/20 Javascript
微信小程序 设置启动页面的两种方法
2017/03/09 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
Node.js console控制台简单用法分析
2019/01/04 Javascript
js实现石头剪刀布游戏
2020/10/11 Javascript
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python遍历目录的4种方法实例介绍
2015/04/13 Python
python实现决策树
2017/12/21 Python
Python3转换html到pdf的不同解决方案
2019/03/11 Python
Python交互环境下打印和输入函数的实例内容
2020/02/16 Python
详解numpy1.19.4与python3.9版本冲突解决
2020/12/15 Python
python opencv肤色检测的实现示例
2020/12/21 Python
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
小学生新学期寄语
2014/01/19 职场文书
JAVA程序员自荐书
2014/01/30 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
销售活动策划方案
2014/08/26 职场文书
学校班子个人对照检查材料思想汇报
2014/09/27 职场文书
思想品德评语大全
2014/12/31 职场文书
法院个人总结
2015/03/03 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
七一晚会主持词
2015/06/29 职场文书
观看《杨善洲》宣传教育片心得体会
2016/01/23 职场文书
2019年最新借条范本!
2019/07/08 职场文书
三年级作文之小小梦想
2019/12/06 职场文书