面向对象封装案例 --- 士兵突击

封装案例 — 士兵突击

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

需求

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

假设每一个新兵都没有枪

定义没有初始值的属性

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

  • None 关键字表示什么都没有
  • 表示一个空对象,没有方法和属性,是一个特殊的常量
  • 可以将None 赋值给任何一个变量
fire 方法需求
  • 1>判断是否有枪
  • 2>喊一声口号
  • 3>装填子弹
  • 4>射击

代码实现

class Gun:
    """枪类"""

    def __init__(self, model):

        # 1.枪的型号
        self.model = model

        # 2.子弹的数量
        self.bullet_count = 0

    def add_bullet(self, count):  # count表示发射子弹的数量
        """添加子弹"""

        self.bullet_count += count

    def shoot_bullet(self):
        """发射子弹"""

        # 1.判断子弹数量
        if self.bullet_count <= 0:
            print('[%s] 没有子弹了...' % self.model)
            return

        # 2.发射子弹, -1
        self.bullet_count -= 1

        # 3.提示发射信息
        print('[%s] 突突突... [%s]' % (self.model, self.bullet_count))


class Soldier:
    """士兵类"""

    def __init__(self, name):

        # 1.士兵的姓名
        self.name = name

        # 2.士兵的枪 -> 新兵没有枪(在定义属性时,如果不知道设置什么初始值,可以设置为 None)
        self.gun = None

    def fire(self):
        """士兵开火"""

        # 1.判断士兵有没有枪
        # if self.gun == None:
        # 在 python中针对None比较时,建议使用 is 判断
        if self.gun is None:
            print('[%s] 还没有枪...' % self.name)

        # 2.高喊口号
        print('冲啊...[%s]' % self.name)

        # 3.让枪装填子弹
        self.gun.add_bullet(50)  # 让士兵的枪装填子弹(一个类的属性作为另一个类的对象)

        # 4.让枪发射子弹
        self.gun.shoot_bullet()  # 让士兵的枪发射子弹(一个类的属性作为另一个类的对象)


# 1.创建枪对象
AK47 = Gun('AK47')

# 2.创建许三多对象
xusanduo = Soldier('许三多')
xusanduo.gun = AK47

xusanduo.fire()


身份运算符

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

  • 在 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 同于判断两个变量引用对象是否为同一个
  • == 用于判断 引用变量的值 是否相等
>>> a=[1,2,3]
>>> b=[1,2,3]
>>> b is a
False
>>> b== a
True

你可能感兴趣的:(面向对象)