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

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

目标

封装
小明爱跑步
存放家具

01. 封装

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

02. 小明爱跑步

需求

小明 体重 75.0 公斤
小明每次 跑步 会减肥 0.5 公斤
小明每次 吃东西 体重增加 1 公斤

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

代码实现:

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 公斤

提示

在 对象的方法内部,是可以 直接访问对象的属性 的
同一个类 创建的 多个对象 之间,属性 互不干扰!

03. 摆放家具

需求

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

剩余面积

在创建房子对象时,定义一个 剩余面积的属性,初始值和总面积相等
当调用 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数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

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

(0)

相关推荐

  • Python面向对象之继承原理与用法案例分析

    本文实例讲述了Python面向对象之继承原理与用法.分享给大家供大家参考,具体如下: 目标 单继承 多继承 面向对象三大特性 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 继承 实现代码的重用,相同的代码不需要重复的编写 多态 不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度 01. 单继承 1.1 继承的概念.语法和特点 继承的概念:子类 拥有 父类 的所有 方法 和 属性 继承的语法 class 类名(父类名): pass 子类 继承自 父类,可以直接 享受

  • Python面向对象之类的封装操作示例

    本文实例讲述了Python面向对象之类的封装操作.分享给大家供大家参考,具体如下: 承接上一节<Python面向对象之类和实例>,学了Student类的定义及实例化,每个实例都拥有各自的name和score.现在若需要打印一个学生的成绩,可定义函数 print_score() 该函数为类外的函数,如下: class Student(object): def __init__(self, name, score): self.name = name self.score = score May

  • Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解

    本文实例讲述了Python面向对象程序设计中类的定义.实例化.封装及私有变量/方法.分享给大家供大家参考,具体如下: 1. 定义类 python中定义一个类的格式如下: class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 self.data2=data2 def __func1(self): print("MyClass类的私有方法被调用!") def print_data(self): s

  • Python面向对象程序设计类的封装与继承用法示例

    本文实例讲述了Python面向对象程序设计类的封装与继承用法.分享给大家供大家参考,具体如下: 访问限制(封装) 1.概念 面向对象语言的三大特征:封装, 继承, 多态. 广义的封装: 类和函数的定义本身就是封装的体现. 狭义的封装:一个类的某些属性,不希望外界直接访问,而是把这个属性私有化[只有当前类持有],然后暴露给外界一个访问的方法. 封装的本质:就是属性私有化的过程. 封装的好处:提供了数据的复用性,保证了数据的安全性. 举例:插排 2.使用 class Person(object):

  • Python面向对象之多态原理与用法案例分析

    本文实例讲述了Python面向对象之多态原理与用法.分享给大家供大家参考,具体如下: 目标 多态 面向对象三大特性 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 定义类的准则 继承 实现代码的重用,相同的代码不需要重复的编写 设计类的技巧 子类针对自己特有的需求,编写特定的代码 多态 不同的 子类对象 调用相同的 父类方法,产生不同的执行结果 多态 可以 增加代码的灵活度 以 继承 和 重写父类方法 为前提 是调用方法的技巧,不会影响到类的内部设计 多态案例演练 需求 1.在

  • Python面向对象之私有属性和私有方法应用案例分析

    本文实例讲述了Python面向对象之私有属性和私有方法.分享给大家供大家参考,具体如下: 01. 应用场景及定义方式 应用场景 在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到 私有属性 就是 对象 不希望公开的 属性 私有方法 就是 对象 不希望公开的 方法 定义方式 在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法 class Women: def __init__(self, name): self

  • python面向对象之类属性和类方法案例分析

    本文实例讲述了python面向对象之类属性和类方法.分享给大家供大家参考,具体如下: 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 -- 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两步: 在内存中为对象 分配空间 调用初始化方法 init 为 对象初始化 对象创建后,内存 中就有了一个对象的 实实在在 的存在 -- 实例 因此,通常也会把: 创建出来的 对象 叫做 类 的 实例 创建对象的 动作 叫做 实例化

  • Python 面向对象之封装、继承、多态操作实例分析

    本文实例讲述了Python 面向对象之封装.继承.多态操作.分享给大家供大家参考,具体如下: 封装.继承.多态 是面向对象的3大特性 为啥要封装 好处 在使用面向过程编程时,当需要对数据处理时,需要考虑用哪个模板中哪个函数来进行操作,但是当用面向对象编程时,因为已经将数据存储到了这个独立的空间中,这个独立的空间(即对象)中通过一个特殊的变量(class)能够获取到类(模板),而且这个类中的方法是有一定数量的,与此类无关的将不会出现在本类中,因此需要对数据处理时,可以很快速的定位到需要的方法是谁

  • python写日志封装类实例

    本文实例讲述了python实现写日志封装类.分享给大家供大家参考.具体如下: # encoding:utf-8 import sys import logging import time def writeLog(message): logger=logging.getLogger() filename = time.strftime('%Y-%m-%d',time.localtime(time.time())) handler=logging.FileHandler("./log/"

  • python对于requests的封装方法详解

    由于requests是http类接口的核心,因此封装前考虑问题比较多: 1. 对多种接口类型的支持: 2. 连接异常时能够重连: 3. 并发处理的选择: 4. 使用方便,容易维护: 当前并未全部实现,后期会不断完善.重点提一下并发处理的选择:python的并发处理机制由于存在GIL的原因,实现起来并不是很理想,综合考虑多进程.多线程.协程,在不考虑大并发性能测试的前提下使用了多线程-线程池的形式实现.使用的是 concurrent.futures模块.当前仅方便支持webservice接口. #

随机推荐