美文网首页
Python 面向对象 - 03 面向对象封装案例

Python 面向对象 - 03 面向对象封装案例

作者: flowerflower | 来源:发表于2019-03-02 22:29 被阅读0次
    😊😊.jpg

    目录
    一、小明爱跑步
    二、士兵突击
    三、摆放家具

    一、小明爱跑步

    需求

    1. 小明 体重 75.0 公斤
    2. 小明每次 跑步 会减肥 0.5 公斤
    3. 小明每次 吃东西 体重增加 1 公斤
      图片.png
    class Person:
        def __init__(self,name,weight):
            # self.属性 = 形参
            self.weight = weight
            self.name = name
        def run(self):
            self.weight -= 0.5
            print("%s还有%.2f公斤" %(self.name,self.weight))
        def eat(self):
            self.weight += 1
            print("%s还有%.2f公斤" % (self.name, self.weight))
    person = Person("小明",75.0)
    person.run()
    person.eat()
    

    图片.png

    二、士兵突击

    需求

    1. 士兵 许三多 有一把 AK47
    2. 士兵 可以 开火
    3. 能够 发射 子弹
    4. 装填 装填子弹 —— 增加子弹数量

    2.1 开发枪类

    class Gun:
        # model: 枪的类型
        def __init__(self,model):
    
            self.model = model
            self.bullet_count = 0
    
        def add_bullet(self,count):
            self.bullet_count += count
    
        def shoot(self):
            if self.bullet_count <= 0:
                print("没有子弹了 停止发射")
                return
            self.bullet_count -= 1
            print("子弹剩余%d" %(self.bullet_count))
    
    # 创建枪对象
    m416 = Gun("m416")
    m416.add_bullet(50)
    m416.shoot()
    

    2.2 开发士兵类

    在定义属性时,如果 不知道设置什么初始值,可以设置为 None

    • None 关键字 表示 什么都没有
    • 表示一个 空对象没有方法和属性,是一个特殊的常量
    • 可以将 None 赋值给任何一个变量

    fire 方法需求

    • 1> 判断士兵是否有枪
    • 2> 装子弹
    • 3> 发射子弹
    class Soldier:
    
        def __init__(self,name):
            # 士兵的名字
            self.name = name
            # 士兵默认没有枪
            self.gun = None
        def fire(self):
            # 判断士兵是否有枪
            # if self.gun == None:
            if self.gun is None:
                return
            # 装子弹
            self.gun.add_bullet(50)
            # 让枪发射子弹
            self.gun.shoot()
    

    完整代码如下:

    class Gun:
        # model: 枪的类型
        def __init__(self,model):
            self.model = model
            self.bullet_count = 0
        def add_bullet(self,count):
            self.bullet_count += count
        def shoot(self):
            if self.bullet_count <= 0:
                print("没有子弹了 停止发射")
                return
            self.bullet_count -= 1
            print("子弹剩余%d" %(self.bullet_count))
    class Soldier:
        def __init__(self,name):
            # 士兵的名字
            self.name = name
            # 士兵默认没有枪
            self.gun = None
        def fire(self):
            # 判断士兵是否有枪
            # if self.gun == None:
            if self.gun is None:
                return
            # 装子弹
            self.gun.add_bullet(50)
            # 让枪发射子弹
            self.gun.shoot()
    m416 = Gun("m416")
    duoduo = Soldier("许三多")
    duoduo.gun = m416
    duoduo.fire()
    print(duoduo.gun)
    
    图片.png

    小结

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

    三、摆放家具

    需求

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

    3.1 创建家具

    class HouseItem:
        # name: 家具名称 area:占地面积
        def __init__(self,name,area):
            self.name = name
            self.area = area
        def __str__(self):
            return "家具的名称是【%s】,占地面积是【%d】平米" %(self.name,self.area)
    
    bed = HouseItem("席梦思",104)
    chest = HouseItem("衣柜",2)
    table = HouseItem("餐桌",2)
    print(bed)
    print(chest)
    print(table)
    
    图片.png

    小结

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

    3.2 创建房间

    class House:
    
        def __init__(self,house_type,total_area):
            self.house_type = house_type
            self.total_area = total_area
            # 剩余面积默认和总面积一致
            self.free_area = total_area
            # 默认没有任何的家具
            self.item_list = []
    
        def addItem(self,item):
            print("要添加%s"%item)
        def __str__(self):
            return ("户型:%s 总面积:%.2f 剩余面积:%.2f 家具名称列表: %s" %(self.house_type,self.total_area,self.free_area,self.item_list))
    
    
    bed = HouseItem("席梦思",104)
    chest = HouseItem("衣柜",2)
    table = HouseItem("餐桌",2)
    print(bed)
    print(chest)
    print(table)
    
    house = House("三室一厅",100)
    house.addItem(bed)
    house.addItem(chest)
    house.addItem(table)
    print(house)
    
    图片.png

    3.3 添加家具

        def addItem(self,item):
            print("要添加%s"%item)
            # 判断家具的面具
            if item.area > self.free_area:
                print("%s的面积太大 无法添加" % item.name)
                return
            # 将家具的名称放到列表里面
            self.item_list.append(item.name)
            # 计算剩余面积
            self.free_area -= item.area
    
    
    图片.png

    3.4 小结

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

    相关文章

      网友评论

          本文标题:Python 面向对象 - 03 面向对象封装案例

          本文链接:https://www.haomeiwen.com/subject/mhusyqtx.html