面向对象的习题, 练习面向对象的思维习惯

第一题

#   1.士兵瑞恩有一把AK47
# 	2.士兵可以开火(士兵开火扣动的是扳机)
# 	3.枪 能够 发射子弹(把子弹发射出去)
# 	4.枪 能够 装填子弹 --增加子弹的数量
#     Soldier                     Gun

#     	name                        model
#     	gun                         bullet_count #子弹数量足够多才能完成射击的动作
#
#     ------
#
#     	__init__(self):                 __init__(self):
#     	fire(self):                     add_bullet(self,count):#装填子弹的
# 								        shoot(self):
#
#     分析:
# 	    1.由于士兵瑞恩有一把AK47,士兵可以开火。故需要先创建枪类
#
# 	    2.枪类(Gun):
# 	    	 (1)属性:型号(model),子弹数目(bullet_count)
# 	    	 (2)方法:发射子弹(shoot),装填子弹(add_bullet)
#
# 	    3.士兵类(Soldier)
# 		(1)属性:姓名(name),枪名(Gun)
# 		 2)方法:开火(fire)
import time
# 定义一个士兵类
class Soldier(object):
    # 士兵的属性为name ,Gun,方法为fire
    def __init__(self, name):
        self.name = name
        self.gun = None

    # 士兵开枪,需要判断枪里面有没有子弹,发射子弹
    def fire(self):
        # 判断士兵是否有枪
        if self.gun:  # 没枪就走else
            #print(f"士兵{self.name}有枪了,开始冲锋")
            # 有枪了,要判断有没有子弹
            if gun.bullet_count:  # 没有子弹,就走else
                #print(f"士兵{self.name}有子弹了,开始开枪")
                # 有子弹,开枪
                self.gun.shoot()
            else:
                print(f"士兵{self.name}没有子弹,只能等死")
                # 没有子弹,装弹
                self.gun.add_bullet(5)
        else:
            print(f"士兵{self.name}没有枪,只能等死")

    def __str__(self):
        return f"大兵{self.name}上战场了"


# 定义一个枪类
class Gun(object):
    # 枪的属性为型号(model),子弹数目(bullet_count)
    # 方法为发射子弹(shoot),装填子弹(add_bullet)
    def __init__(self, model):
        self.model = model
        self.bullet_count = 0

    def add_bullet(self, nums):
        self.bullet_count += nums
        print(f"装弹成功,继续开枪")
        self.shoot()

    def shoot(self):
        print("开枪!!!!!")
        self.bullet_count -= 1
        print(f"还剩下{self.bullet_count}课子弹")


# 定义一个士兵
person = Soldier("瑞恩")
print(person)
# 定义一把枪
gun = Gun("AK47")
# 给这个士兵一把枪,40发子弹
person.gun = gun
# 让士兵开火
person.fire()

num = 1
#自动开枪
while True:
    if num == 2:
        time.sleep(5)
    else:
        num += 1
        person.fire()

第二题

#
# 1.房子有户型,总面积和家具名称列表,新房子没有任何的家具
# 2.家具有名字和占地面积,其中
#       床: 占4平米
#     衣柜: 占2平面
#     餐桌: 占1.5平米
#
#  3.将以上三件家具添加到房子中
#
#  4.打印房子时,要求输出:户型,总面积,剩余面积,家具名称列表
#
#  分析:
#  1.由于要将家具放入房子中,所以需要先创建家具类
#
#  2.家具类:
#  (1)属性:名字(name),占地面积(area)
#  (2)对象:床(bed),衣柜(closet),餐桌(table)
#
#  3.房子类:
#  (1)属性:户型(house_style),总面积(zarea),
#     家具名称列表(namelist) (新房子没有任何的家具,即初始家具名称列表为空列  表)
#     剩余面积(farea) (由于打印房子时,要求输出'剩余面积',所以剩余面积为房子  的隐含属性)
#  (2)方法:添加家具(add_item)

# 定义一个房子类(型号,大小),,,一个家具类(名字,大小),,
#问题,add_item中的fur.name是怎么从Fur方法中得到的名字
class House(object):
    def __init__(self, house_style, zarea):
        self.house_style = house_style
        self.zarea = zarea
        self.farea = zarea  # 啥意思啊啊啊啊啊
        self.fur_item = []

    def add_item(self, fur):
        # 要添加家具,就要面积足够
        if self.farea >= self.zarea:
            self.fur_item.append(fur.name)
            self.farea -= fur.area
        else:
            print("房子面积不够了")
    def __str__(self):
        return f"房子类型:{self.house_style},总面积:{self.zarea},有{self.fur_item}家具,剩余面积为:{self.farea}"

class Fur(object):
    def __init__(self, name, area):
        self.name = name
        self.area = area


# 创建对象,现在有双人床,大衣柜,桌子了
bed = Fur("双人床", 4)
closet = Fur("大衣柜", 2)
table = Fur("桌子", 1.5)
# 弄一个房子 house接收房子方法的值
house = House("一室一厅", 10)
# 添加双人床
house.add_item(bed)
print(house)

第三题

# 用面向对象的思维模拟栈的结构

# 分析:1.先进后出
#     2.查看有哪些元素
#     3.弹出栈顶
#     4.查询栈顶元素
#     5.判空
#     6添加元素
#     7.用列表


# 定义一个栈类,
# 栈里面有一个空列表,因为栈下面是列表,,,,不然我们水平不够
class MyStack(object):
    def __init__(self):
        self.stack = []

    # 添加数据,需要一个参数传入
    def push(self, num):
        self.stack.append(num)
        print(self.stack)

    # 弹出栈顶元素,需要判空
    def pop(self):
        if self.stack:
            # 空的,假的,不会进去,走else,,所以else写没有元素
            # if里面就写弹出元素
            self.stack.pop()
        else:
            print("没有元素可以操作")

    # 查询最后一位元素
    def look_args(self):
        if self.stack:
            # 空的,假的,不会进去,走else,,所以else写没有元素
            # if里面就写弹出元素
            print(self.stack[-1])
        else:
            print("没有元素可以操作")

    # 判空
    def kong(self):
        if self.stack:#如果空,就会走else 就输出false
            return False
        else:
            return True

    def stack_lenght(self):
        return len(self.stack)


ms = MyStack()
ms.push("111")
ms.push("111")
ms.push("111")
ms.push("111")
ms.push("111")
ms.push("111")
x = ms.kong()
print(x)