面向对象速查笔记(二)

Published on 2018 - 01 - 09

需求:

1.士兵许三多有一把AK47

2.士兵可以开火

3.能够发射子弹

4.可以装填子弹

本篇重点:

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

class Gun:
    """
    定义一个枪类,并且通过参数model传入枪支型号
    """
    def __init__(self, model):
        """
        bullet_count用作子弹计数,初始值为0,通过add_bullet方法增加子弹
        """
        self.model = model
        self.bullet_count = 0

    def add_bullet(self, count):
        """
        加子弹
        :type count: 通过参数传入增加子弹的数量
        """

        self.bullet_count += count

    def shoot(self):
        """
        射击Function,首先判断有没有子弹,没有子弹退出不再执行
        """

        if self.bullet_count <= 0:
            print("%s 无子弹" % self.model)
            return

        self.bullet_count -= 1

        print("[%s] 子弹-1 剩余子弹 %d" %
              (self.model, self.bullet_count))


class Soldier:
    """
    定义一个士兵类,设置初始值姓名和枪型,
    在定义属性时,如果不知道设置什么初始值,可以设置为None
    """
    def __init__(self, name):
        """
        重点重申:一个对象的属性,可以是另外一个类创建的对象
        :param name: 传入的士兵姓名
        :param self.gun:士兵初期是没有枪的,所以设置为None,通过Gun类传入到这里
        """
        self.name = name
        self.gun = None

    def fire(self):

        if self.gun is None:
            print("士兵%s还没有装备枪" % self.name)
            return

        self.gun.add_bullet(10)
        print("士兵[%s]开枪" % self.name)
        self.gun.shoot()


ak47 = Gun("AK47")
soldier = Soldier("许三多")


"""
soldier的初始属性gun,是通过ak47这个对象传入的。
而ak47这个对象是由Gun类创建的,
所以说 "一个对象的属性,可以是另外一个类创建的对象
"""
soldier.gun = ak47


soldier.fire()

运行结果:

士兵[许三多]开枪
[AK47] 子弹-1 剩余子弹 9