• Python面向对象之面向对象封装案例


    面向对象封装案例

    封装

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

    一个对象的属性可以是另一个类创建的对象

    跑步案例

    单对象案例

    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("今天跑步了,又能瘦一点了")
            self.weight -= 0.5
    
        def eat(self):
            print("吃了一顿,又要胖了,唉")
            self.weight += 1
    
    
    xiaoming = Person("小明", 75.0)
    print(xiaoming)
    xiaoming.run()
    xiaoming.eat()
    print(xiaoming)
    
    # 小明 的体重是 75.00
    # 今天跑步了,又能瘦一点了
    # 吃了一顿,又要胖了,唉
    # 小明 的体重是 75.50
    

    一个类创建多个对象案例

    多个对象属性之间互不干扰;即小美跑步和吃东西并不影响小明的体重;

    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.0)
    xiaoming.run()
    xiaoming.eat()
    
    print(xiaoming)
    
    xiaohong = Person("小红", 45.0)
    xiaohong.run()
    xiaohong.eat()
    
    print(xiaohong)
    

    家具案例

    被使用的类应该先开发;
    房子中要有家具,所以在开发房子前应该先开发家具类;

    定义家具类

    class HouseItem:
        def __init__(self, name, area):
            self.name = name
            self.area = area
    
        def __str__(self):
            return "%s 占地 %.2f" % (self.name, self.area)
    
    
    bed = HouseItem("席梦思", 4)
    chest = HouseItem("衣柜", 2)
    table = HouseItem("桌子", 1.5)
    
    print(bed)
    print(chest)
    print(table)
    
    # 席梦思 占地 4.00
    # 衣柜 占地 2.00
    # 桌子 占地 1.50
    

    定义房子类

    class HouseItem:
        def __init__(self, name, area):
            self.name = name
            self.area = area
    
        def __str__(self):
            return "%s 占地 %.2f" % (self.name, self.area)
    
    
    class House:
        def __init__(self, house_type, area):
            self.house_type = house_type
            self.area = area
            # 剩余面积和家具列表
            self.free_area = area
            self.house_item = []
    
        def __str__(self):
            # python能够自动将一对括号内的代码连接在一起
            return ("户型:%s, 总面积:%.2f, 剩余面积:%.2f, 家具:%s"
                    % (self.house_type, self.area, self.free_area, self.house_item))
    
        def add_item(self, item):
            print("要添置 %s" % item)
    
    
    # 创建家具
    bed = HouseItem("席梦思", 4)
    chest = HouseItem("衣柜", 2)
    table = HouseItem("桌子", 1.5)
    
    # 创建房子
    my_house = House("两室一厅", 80)
    my_house.add_item(bed)
    my_house.add_item(chest)
    my_house.add_item(table)
    
    print(my_house)
    
    # 要添置 席梦思 占地 4.00
    # 要添置 衣柜 占地 2.00
    # 要添置 桌子 占地 1.50
    # 户型:两室一厅, 总面积:80.00, 剩余面积:80.00, 家具:[]
    

    添置家具代码的完成
    添置家具前先判断,家具是否超过空闲面积,如果太大就不添置;再进行添置下一件,小的则添置进去。

    class HouseItem:
        def __init__(self, name, area):
            self.name = name
            self.area = area
    
        def __str__(self):
            return "%s 占地 %.2f" % (self.name, self.area)
    
    
    class House:
        def __init__(self, house_type, area):
            self.house_type = house_type
            self.area = area
            # 剩余面积和家具列表
            self.free_area = area
            self.house_item = []
    
        def __str__(self):
            # python能够自动将一对括号内的代码连接在一起
            return ("户型:%s, 总面积:%.2f, 剩余面积:%.2f, 家具:%s"
                    % (self.house_type, self.area, self.free_area, self.house_item))
    
        def add_item(self, item):
            print("要添置 %s" % item)
            # 判断家具面积
            if item.area >= self.free_area:
                print("%s 的面积太大,无法放下" % item)
                return
            # 将家具名称放在家具列表中
            self.house_item.append(item.name)
    
            # 计算剩余面积
            self.free_area -= item.area
    
    
    # 创建家具
    bed = HouseItem("席梦思", 15)
    chest = HouseItem("衣柜", 9)
    table = HouseItem("桌子", 8)
    
    # 创建房子
    my_house = House("三室一厅", 80)
    my_house.add_item(bed)
    my_house.add_item(chest)
    my_house.add_item(table)
    
    print(my_house)
    
    # 要添置 席梦思 占地 15.00
    # 要添置 衣柜 占地 9.00
    # 要添置 桌子 占地 8.00
    # 户型:三室一厅, 总面积:80.00, 剩余面积:48.00, 家具:['席梦思', '衣柜', '桌子']
    

    士兵开枪案例

    一个对象的属性可以是另一个类创建的对象

    士兵开枪案例

    class Gun:
        def __init__(self, model):
            self.model = model
            self.bullet_count = 0
    
        def add_bullet(self, count):
            self.bullet_count += count
    
        def shoot(self):
            # 1.判断子弹数量
            if self.bullet_count <= 0:
                print("%s 没有子弹了,请进行填充" % self.model)
                return
            # 2.发射子弹
            self.bullet_count -= 1
            # 3.提示子弹发射
            print("[%s]突突突。。。[%d]" % (self.model, self.bullet_count))
    
    
    class Solider:
        def __init__(self, name):
            # 士兵姓名
            self.name = name
            # 枪,新兵没有枪
            self.gun = None
    
        def fire(self):
            # 1.判断有没有枪
            if self.gun is None:
                print("%s 还没有枪。。。" % self.name)
                return
            # 2.喊口令
            print("%s 冲鸭。。。" % self.name)
            # 3.装填子弹
            self.gun.add_bullet(50)
            # 4.让枪发射子弹
            self.gun.shoot()
            pass
    
    
    # 创建枪对象
    ak47 = Gun("AK47")
    
    # 创建士兵
    xusanduo = Solider("许三多")
    xusanduo.gun = ak47
    xusanduo.fire()
  • 相关阅读:
    Html.Partial和Html.RenderPartial, Html.Action和Html.RenderAction的区别
    cygwin下git出现cabundle.crt相关错误的解决办法
    Orchard CMS前台页面为什么没有Edit链接?
    Entity Framework练习题
    分析Autofac如何实现Controller的Ioc(Inversion of Control)
    在Winform,Silvelight,WPF等程序中访问Asp.net MVC web api
    适合.net程序员的.gitignore文件
    如何处理Entity Framework中的DbUpdateConcurrencyException异常
    Asp.net MVC中repository和service的区别
    smplayer中使用srt字幕乱码问题
  • 原文地址:https://www.cnblogs.com/yifchan/p/python-1-13.html
Copyright © 2020-2023  润新知