• Python 面向对象 --- 封装案例 ll


    目标

    • 士兵突击案例
    • 身份运算符

    封装

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

    01,士兵突击

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

    
        class Gun:
        
            def __init__(self,model):
                self.model = model
        
            def add_bullet(self,count):
                self.bullet_count = count
        
            def shoot(self):
                # 判读是否还有子弹
                if  self.bullet_count <= 0:
                    print("[%s] 木有子弹啦,剩余 %d" % (self.model, self.bullet_count))
                    return
        
                # 发射子弹
                self.bullet_count -= 1
        
                print("%s 发射子弹 [%d]" % (self.model, self.bullet_count))
        
        
        # 创建枪对象
        ak47 = Gun("AK47")
        ak47.add_bullet(50)
        ak47.shoot()
        
        
        # 结果呈现
        AK47 发射子弹 [49]
    
    

    1.2 开发士兵类

    假设:每一个新兵 都 没有枪

    定义没有初始值的属性

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

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

    fire 方法需求

    • 1> 判断是否有枪,没有枪不能出征
    • 2> 喊一声口号
    • 3> 装填子弹
    • 4> 射击
    
        class Gun:
        
            def __init__(self,model):
                self.model = model
        
            def add_bullet(self,count):
                self.bullet_count = count
        
            def shoot(self):
                # 判读是否还有子弹
                if  self.bullet_count <= 0:
                    print("[%s] 木有子弹啦,剩余 %d" % (self.model, self.bullet_count))
                    return
        
                # 发射子弹
                self.bullet_count -= 1
        
                print("%s 发射子弹 [%d]" % (self.model, self.bullet_count))
        
        
        class Soldier:
            def __init__(self, name):
                # 1,姓名
                self.name = name
                # 2,枪 - 新兵没有
                self.gun = None
        
            def fire(self):
                # 1,判读士兵是否有枪
                if self.gun == None:
                    print("[%s] 没有枪,不可出征" % self.name)
                    return
        
                # 2,高喊口号
                print("[%s] 端着 【%s】 冲冲冲" % (self.name, self.gun.model))
        
                # 3,装子弹
                self.gun.add_bullet(50)
                # 4,开枪
                self.gun.shoot()
        
        
        # 1,创建枪对象
        ak47 = Gun("AK47")
        # ak47.add_bullet(50)
        # ak47.shoot()
        
        # 2,创建许三多
        xusanduo = Soldier("许三多")
        xusanduo.gun = ak47
        xusanduo.fire()
        print(xusanduo.gun)
        
        
        # 结果呈现
        [许三多] 端着 【AK47】 冲冲冲
        AK47 发射子弹 [49]
        <__main__.Gun object at 0x0000001C4C57EC18>
    
    

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

    02,身份运算符

    身份运算符用于 比较 两个对象的 内存地址 是否一致 -- 是否是对同一个对象的引用

    • python 中针对 None 比较时,建议使用 is 判断
    运算符 描述 实例
    is is 是判断两个标识符是不是引用同一个对象 x is y ,类似 id(x) == id(y)
    is not is not 是判断两个标识符是不是引用不同对象 x is not y ,类似 id(x) != id(y)

    is 与 == 区别:

    is 用于判断 两个变量 引用对象是否为同一个
    == 用于判断 引用变量的值 是否相等

    
    	In [1]: x = [1, 2, 3]
    	
    	In [2]: y = [1, 2]
    	
    	In [3]: id(x)
    	Out[3]: 140113651590920
    	
    	In [4]: id(y)
    	Out[4]: 140113663786184
    	
    	In [5]: y.append(3)
    	
    	In [6]: y
    	Out[6]: [1, 2, 3]
    	
    	In [7]: id(y)
    	Out[7]: 140113663786184
    	
    	In [8]: x == y
    	Out[8]: True
    	
    	In [9]: x is y
    	Out[9]: False
    
    

    
        class Gun:
        
            def __init__(self,model):
                self.model = model
        
            def add_bullet(self,count):
                self.bullet_count = count
        
            def shoot(self):
                # 判读是否还有子弹
                if  self.bullet_count <= 0:
                    print("[%s] 木有子弹啦,剩余 %d" % (self.model, self.bullet_count))
                    return
        
                # 发射子弹
                self.bullet_count -= 1
        
                print("%s 发射子弹 [%d]" % (self.model, self.bullet_count))
        
        
        class Soldier:
            def __init__(self, name):
                # 1,姓名
                self.name = name
                # 2,枪 - 新兵没有
                self.gun = None
        
            def fire(self):
                # 1,判读士兵是否有枪
                # if self.gun == None:
                if self.gun is None:
                    print("[%s] 没有枪,不可出征" % self.name)
                    return
        
                # 2,高喊口号
                print("[%s] 端着 【%s】 冲冲冲" % (self.name, self.gun.model))
        
                # 3,装子弹
                self.gun.add_bullet(50)
                # 4,开枪
                self.gun.shoot()
        
        
        # 1,创建枪对象
        ak47 = Gun("AK47")
        # ak47.add_bullet(50)
        # ak47.shoot()
        
        # 2,创建许三多
        xusanduo = Soldier("许三多")
        xusanduo.gun = ak47
        xusanduo.fire()
        print(xusanduo.gun)
        
        
        # 结果呈现
        [许三多] 端着 【AK47】 冲冲冲
        AK47 发射子弹 [49]
        <__main__.Gun object at 0x000000711CE8EBE0>
    
    
  • 相关阅读:
    [转] 浅谈 C++ 中的 new/delete 和 new[]/delete[]
    [转] dpkg-deb命令
    [转] 将DOS格式文本文件转换成UNIX格式
    STM32与FreeRTOS实现低功耗
    设置Beyond Compare 为 Git 默认的比较工具
    [转]Linux进程间通信——使用消息队列
    还你一个自由、干净的网络环境
    Linux下的Hello world
    Cortex-M3中C与汇编的交互
    数据结构25:矩阵转置算法(三元组顺序表)
  • 原文地址:https://www.cnblogs.com/xiaoqshuo/p/9512683.html
Copyright © 2020-2023  润新知