python 面向对象:封装---对象的属性可以是另一个类创建的对象

# 对象封装:对象的属性可以是另一个类创建的对象
# 案例需求:
# 1、士兵许三多有一把AK47
# 2、士兵用枪射击标靶
# 3、枪能装填和发射子弹


class Gun:

    # 分析:
    # 枪的属性:1、枪有型号区分;2、枪要有子弹
    # 枪的方法:1、能装填子弹;2、能发射子弹
    def __init__(self, model):
        self.model = model
        self.bullet_count = 0

    def add_bullet(self, count):
        self.bullet_count += count

    def shoot(self):
        self.bullet_count -= 1


class Soldier:

    # 分析:
    # 士兵属性:士兵有名字;“可能”会有配枪
    # 士兵方法:士兵用枪射击标靶
    def __init__(self, name):
        self.name = name
        self.gun = None     # 因为该属性不确定,所以用None

    def check_gun(self):

        if self.gun.bullet_count <= 0:
            print(F"{self.gun.model} 没有子弹,请装填子弹")

            print("装弹完成")

    def fire(self, shoot_count):
        if self.gun is None:
            print(F"士兵 {self.name} 没有配枪,无法射击!")
            return
        else:
            print(F"士兵 {self.name} 已配备 {self.gun.model}!")
        self.gun.add_bullet(shoot_count)
        for i in range(shoot_count):
            self.gun.shoot()
            print(F"{self.name} 用 {self.gun.model} 成功射中标靶
子弹剩余:{self.gun.bullet_count}")


xusanduo = Soldier("许三多")
xusanduo.fire(3)    # 士兵 许三多 没有配枪,无法射击!
ak47 = Gun("AK47")  # 士兵 许三多 已配备 AK47!
xusanduo.gun = ak47
xusanduo.fire(3)    # 许三多 用 AK47 成功射中标靶,子弹剩余:XXX

# 总结:Soldier类的属性self.gun的值为Gun类创建的对象“ak47”
原文地址:https://www.cnblogs.com/testlearn/p/11719762.html