目标

  • 士兵突击案例
  • 身份运算符
  • 演练重点:
    1、一个对象的属性可以是另一个类创建的对象

    2、定义没有初始值的属性
    在定义属性时,如果不知道设置什么初始值,就可以设置为None
    None关键字表示什么都没有,表示一个空对象,没有方法和属性,是一个特殊常量
    可以将None赋值给任何一个变量

01 士兵突击
需求:

  • 士兵 许三多 有一把AK47
  • 士兵可以开火
  • 枪能够发射子弹
  • 枪装填子弹——增加子弹数量
    图片说明

02 身份运算符

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

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

is 与 == 的区别:

  • is 用于判断两个变量引用对象是否为同一个
  • == 用于判断 引用变量的值 是否相等
class Gun:
    def __init__(self,model):
        self.model = model
        self.bullet_count = 0

    def add_bullet(self,count):
        self.bullet_count += count
        print("添加子弹完成")

    def shoot(self):
        # 1.判断子弹数量
        if self.bullet_count > 0:
            # 2.发射子弹
            self.bullet_count -= 1
            print("[%s] 突突突...[%d]" % (self.model,self.bullet_count))
            return
        # 3.提示发射信息
        print("[%s] 没有子弹了..." % self.model)


class Soldier:
    def __init__(self,name):
        self.name = name
        # 枪——新兵没有枪
        self.gun = None

    def fire(self):
        # 判断士兵是否有枪
        # if self.gun == None:
        if self.gun is None:
            print("[%s]还没有枪" % self.name)
            return
        # 让枪装填子弹
        self.gun.add_bullet(10)
        # 让枪发射子弹
        self.gun.shoot()


# 创建枪对象
ak47 = Gun("ak47")

# 创建许三多
xusanduo = Soldier("许三多")
xusanduo.gun = ak47
xusanduo.fire()