面向对象的习题, 练习面向对象的思维习惯
第一题
# 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)