Python面向对象之 - 类


类的演示1:  士兵突击

# 需求
# 假设: 每一个新兵都没有枪
# 士兵许三多有一把AK47
# 士兵可以开火(只有枪内有子弹才可以开火)
# 枪能够发射子弹(在装填子弹之前枪内没有子弹)
# 枪可以装填子弹(增加子弹数量,每次装填数量可以灵活选择)

class Gun():
    def __init__(self,model):
        """初始化方法信息"""
        self.model = model
        self.bullet_count = 0

    def __str__(self):
        """返回定制信息"""
        return "%s枪还剩下%d颗子弹"%(self.model,self.bullet_count)

    def add_bullet(self,count):
        """装填子弹"""
        self.bullet_count += count
        print("装填子弹%d颗"%count)

    def shoot(self):
        """射击"""
        if self.bullet_count > 0:
            self.bullet_count -= 1
            print("%s突突突...剩余[%d]"%(self.model,self.bullet_count))
        else:
            print("没有子弹了")
            return


class Soldier():
    def __init__(self,name):
        """初始化方法信息"""
        self.name = name
        self.gun = None

    # 不需要返回定制信息时不用定义__str__方法
    # def __str__(self):
    #     """返回定制信息"""
    #     return "新兵%s拿着一把%s,剩余子弹%d颗."%(self.name,self.gun.model,self.gun.bullet_count)

    def fire(self):
        """士兵开火"""
        if self.gun is None:
            print("%s还没有枪,不能开火"%self.name)
            return
        else:
            self.gun.shoot()

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

# 创建一个士兵对象
xusanduo = Soldier("许三多")
xusanduo.gun = ak47     # 给新兵一把ak47
ak47.add_bullet(5)      # 装填子弹5颗
xusanduo.fire()         # 开火

类的演示2:  摆放家具

# 需求
# 房子有户型,总面积,和家具名称列表
# 家具有名字和占地面积,其中:
#     席梦思占地 4 平米
#     衣柜占地 2 平米
#     餐桌占地 1.5 平米
# 将以上家具添加到房子中
# 打印房子时,要求输出:户型,总面积,剩余面积,家具名称列表

class HouseItem():
    def __init__(self,name,use_area):
        """初始化家具属性"""
        self.name = name
        self.use_area = use_area

    def __str__(self):
        """返回定制信息"""
        return "%s占地总面积是%.1f平米"%(self.name,self.use_area)


class House():
    def __init__(self,type,area):
        """初始化房子属性"""
        self.type = type
        self.area = area
        self.free_area = area
        self.item_list = []

    def __str__(self):
        """返回房子定制信息"""
        return ("户型:%s\n总面积:%.1f\n剩余面积:%.1f\n家具名称列表:%s"
                %(self.type,self.area,self.free_area,self.item_list))

    def add_item(self,item):
        """设定添加家具方法"""
        if item.use_area > self.free_area:       # 如果要添加的家具面积大于剩余面积
            print("%s的面积太大了,不能添加到房子中!"%item.name)
            return                               # 程序碰到return,后面的内容不会被执行
        self.item_list.append(item.name)        # 把添加进来的家具追加到家具列表中
        self.free_area = self.free_area - item.use_area       # 家具添加进来后,计算剩余面积

# 创建了三个家具对象: 床,衣服,餐桌
bed = HouseItem("席梦思",4)
close = HouseItem("衣柜",2)
table = HouseItem("餐桌",1.5)

# 创建房子对象
my_home = House("两室一厅",100)
# 向房子内添加家具
my_home.add_item(bed)
my_home.add_item(close)
my_home.add_item(table)
# 输出房子对象的定制信息
print(my_home)