一、模型说明
View视图:处理界面逻辑,输入输出
Controller控制器:处理核心逻辑,存储计算
Model模型:将多个变量组合为一种类型
二、注意事项
类外通过自定义对象名调用
类中通过self调用
""" 疫情信息管理系统 学习MVC的软件架构 View Controller Model 视图:处理界面逻辑,输入输出 控制器:处理核心逻辑,存储计算 模型:将多个变量组合为一种类型 餐厅的架构 服务员 <--> 传菜员 <--> 厨师 """ class EpidemicModel: """ 数据模型 """ def __init__(self, region="", new=0, now=0, total=0, eid=0): self.region = region self.new = new self.now = now self.total = total self.eid = eid # 操作全球唯一标识符的变量 class EpidemicView: """ 疫情视图 """ def __init__(self): self.controller = EpidemicController() def display_menu(self): """ 显示菜单 """ print("按1键录入疫情信息") print("按2键显示疫情信息") print("按3键删除疫情信息") print("按4键修改疫情信息") def select_menu(self): """ 选择菜单 """ number = input("请输入选项:") if number == "1": # 重点1:类中通过self调用 self.input_epidemic() elif number == "2": self.display_epidemics() def input_epidemic(self): """ 录入疫情信息 """ # 重点3:每次录入新数据创建新Model对象 # model = EpidemicModel( # input("请输入疫情地区:"), # int(input("请输入现有人数:")), # int(input("请输入新增人数:")), # int(input("请输入累计人数:")), # ) # model = EpidemicModel( # region=input("请输入疫情地区:"), # now=int(input("请输入现有人数:")), # new=int(input("请输入新增人数:")), # total=int(input("请输入累计人数:")), # ) model = EpidemicModel() model.region = input("请输入疫情地区:") model.new = int(input("请输入新增人数:")) model.now = int(input("请输入现有人数:")) model.total = int(input("请输入累计人数:")) self.controller.add_epidemic(model) def display_epidemics(self): """ 显示所有疫情信息 """ for item in self.controller.list_epidemic: print("%s地区的编号是%s,新增%s人,现有%s人,累计%s人" % (item.region, item.eid, item.new, item.now, item.total)) class EpidemicController: """ 疫情控制器 """ def __init__(self): # Python 类型标注:为变量增加类型 self.list_epidemic = [] # type:list[EpidemicModel] self.start_id = 1001 def add_epidemic(self, info): """ 添加疫情信息 :param info:EpidemicModel类型,新信息 """ # 设置自增长编号 info.eid = self.start_id self.start_id += 1 # 为下一个数据可以使用不同数据 # 添加到列表中 self.list_epidemic.append(info) # 重点2:类外通过自定义对象名调用 view = EpidemicView() # controller -> [] while True: view.display_menu() view.select_menu() #select_menu(view)->input_epidemicmmvc
三、案例MVC内存图
四、案例继续深化学习
"""
疫情信息管理系统
学习MVC的软件架构
View Controller Model
视图:处理界面逻辑,输入输出
控制器:处理核心逻辑,存储计算
模型:将多个变量组合为一种类型
餐厅的架构
服务员 <--> 传菜员 <--> 厨师
"""
class EpidemicModel:
"""
数据模型
"""
def __init__(self, region="", new=0, now=0, total=0, eid=0):
self.region = region
self.new = new
self.now = now
self.total = total
self.eid = eid # 操作全球唯一标识符的变量
class EpidemicView:
"""
疫情视图
"""
def __init__(self):
self.controller = EpidemicController()
def display_menu(self):
"""
显示菜单
"""
print("按1键录入疫情信息")
print("按2键显示疫情信息")
print("按3键删除疫情信息")
print("按4键修改疫情信息")
def select_menu(self):
"""
选择菜单
"""
number = input("请输入选项:")
if number == "1":
# 重点1:类中通过self调用
self.input_epidemic()
elif number == "2":
self.display_epidemics()
elif number == "3":
self.delete_epidemic()
elif number =="4":
self.modify_epidemic()
def input_epidemic(self):
"""
录入疫情信息
"""
# 重点3:每次录入新数据创建新Model对象
# model = EpidemicModel(
# input("请输入疫情地区:"),
# int(input("请输入现有人数:")),
# int(input("请输入新增人数:")),
# int(input("请输入累计人数:")),
# )
# model = EpidemicModel(
# region=input("请输入疫情地区:"),
# now=int(input("请输入现有人数:")),
# new=int(input("请输入新增人数:")),
# total=int(input("请输入累计人数:")),
# )
model = EpidemicModel()
model.region = input("请输入疫情地区:")
model.new = int(input("请输入新增人数:"))
model.now = int(input("请输入现有人数:"))
model.total = int(input("请输入累计人数:"))
self.controller.add_epidemic(model)
def display_epidemics(self):
"""
显示所有疫情信息
"""
for item in self.controller.list_epidemic:
print("%s地区的编号是%s,新增%s人,现有%s人,累计%s人"
% (item.region, item.eid, item.new, item.now, item.total))
def delete_epidemic(self):
"""
删除疫情,录入编号,传递给controller,显示结果
"""
eid = int(input("请输入需要删除的疫情编号:")) # 将输入的编号转为int类型
if self.controller.remove_epidemic(eid):
print("删除成功哦~")
else:
print("哦~不行")
def modify_epidemic(self):
"""
修改疫情信息,录入、传递、显示
:return:
"""
model = EpidemicModel()
model.eid = int(input("请输入需要需改的疫情编号:"))
model.region = input("请输入疫情地区:")
model.new = int(input("请输入新增人数:"))
model.now = int(input("请输入现有人数:"))
model.total = int(input("请输入累计人数:"))
if self.controller.update_epidemic(model):
print("修改成功")
else:
print("需改失败")
class EpidemicController:
"""
疫情控制器
"""
def __init__(self):
# Python 类型标注:为变量增加类型
self.list_epidemic = [] # type:list[EpidemicModel]
self.start_id = 1001
def add_epidemic(self, info):
"""
添加疫情信息
:param info:EpidemicModel类型,新信息
"""
# 设置自增长编号
info.eid = self.start_id
self.start_id += 1 # 为下一个数据可以使用不同数据
# 添加到列表中
self.list_epidemic.append(info)
def remove_epidemic(self, eid: int):
"""
在列表中移除疫情信息
:param eid: int类型,疫情编号
:return: bool类型,True表达移除成功,False表达移除失败
"""
for i in range(len(self.list_epidemic)):
if self.list_epidemic[i].eid == eid:
del self.list_epidemic[i]
return True # 循环中途退出,返回成功
return False # 列表没有找到,则删除失败
# remove内部还有层循环,所以带来二次查找
# for item in self.list_epidemic:
# 列表名.remove(item)
def update_epidemic(self, new):
"""
更新疫情信息
:param new: Model类型
:return: bool类型
"""
# for i in range(len(self.list_epidemic)):
# self.list_epidemic[i].region = new.region
for item in self.list_epidemic:
if item.eid == new.eid:
# item.region = new.region
# item.new = new.new
# item.now = new.now
item.__dict__ = new.__dict__
return True
return False
# 重点2:类外通过自定义对象名调用
view = EpidemicView() # controller -> []
while True:
view.display_menu()
view.select_menu() # select_menu(view)->input_epidemic
五、练习
"""
完成餐厅信息管理系统
练习1:录入餐厅信息
view:显示菜单、选择菜单、录入信息
model:城市city,店名name,点评remark,人均money
controller:添加信息
练习2:添加餐厅信息
model:编号rid
controller:添加信息(设置编号,追加到列表)
练习3:显示全部餐厅信息
view:按2键,打印餐厅信息
controller:增加类型标注#type:list[RestaurantModel]
练习4:删除餐厅信息
view:按3键,删除餐厅信息,录入编号,显示成败
controller: 在列表中查找元素
练习5:修改餐厅信息
view:按4键,修改餐厅信息,录入信息,显示成败
controller: 在列表中查找元素,替换__dict__
"""
class RestaurantView:
"""
界面视图
"""
def __init__(self):
self.control = RestaurantController()
def display_menu(self):
# Alt+Shift 选择多列
print("按1键录入餐厅信息")
print("按2键显示餐厅信息")
print("按3键删除餐厅信息")
print("按4键修改餐厅信息")
def select_menu(self):
num = input("请输入选项:")
if num == "1":
# 生成函数快捷键:Alt+回车
self.input_resturant()
if num == "2":
self.display_info()
if num == "3":
self.remove_resturant()
if num == "4":
self.change_resturant()
def input_resturant(self):
# 因为有默认值,所以括号里可以为空
model = RestaurantModel()
model.name = input("请输入餐厅名字")
model.city = input("请输入餐厅地区")
model.remark = int(input("请输入餐厅点评人数"))
model.money = int(input("请输入餐厅人均消费"))
self.control.add_info(model)
def display_info(self):
for item in self.control.list_restaurant:
print("信息为",item.rid,item.name,item.city,
item.remark,item.money)
def remove_resturant(self):
rid = int(input("请输入要删除的餐厅编号:"))
if self.control.remove_info(rid): # 加入失败rid:int,定义函数时添加
print("删除成功")
else:
print("删除失败")
# def change_resturant(self):
# rid = int(input("请输入要修改的餐厅编号:"))
# rname = int(input("请输入要修改的餐厅名称:"))
# rcity = int(input("请输入要修改的餐厅城市:"))
# rremark = int(input("请输入要修改的餐厅点评:"))
# rmoney = int(input("请输入要修改的餐厅人均消费:"))
# if self.control.change_info(rid,rname,rcity,rremark,rmoney):
# 加入失败rid:int,定义函数时添加
# print("修改成功")
# else:
# print("修改失败")
# 优化
def change_resturant(self):
model = RestaurantModel()
model.rid = int(input("请输入要修改的餐厅编号:"))
model.rname = int(input("请输入要修改的餐厅名称:"))
model.rcity = int(input("请输入要修改的餐厅城市:"))
model.rremark = int(input("请输入要修改的餐厅点评:"))
model.rmoney = int(input("请输入要修改的餐厅人均消费:"))
if self.control.change_info(model): # 加入失败rid:int,定义函数时添加
print("修改成功")
else:
print("修改失败")
# shift+F6统一改名字
class RestaurantModel:
# 注意添加默认值
def __init__(self, rid = 0, name="", city="", remark=0, money = 0):
self.rid = rid
self.name= name
self.city = city
self.remark = remark
self.money = money
class RestaurantController:
"""
控制器
"""
def __init__(self):
self.list_restaurant = [] # type:list[RestaurantModel]
self.start_rid = 1000
def add_info(self,info):
info.rid = self.start_rid
self.start_rid += 1
self.list_restaurant.append(info)
def remove_info(self, rid: int):
for i in range(len(self.list_restaurant)):
if self.list_restaurant[i].rid == rid:
del self.list_restaurant[i]
return True
return False
def change_info(self, new_model):
'''
:param new_model:Model类型
:return:bool类型
'''
# for i in range(len(self.list_restaurant)):
# if self.list_restaurant[i].rid == new_model.rid:
# self.list_restaurant[i].name = new_model.name
# self.list_restaurant[i].city = new_model.city
# self.list_restaurant[i].remark = new_model.remark
# self.list_restaurant[i].money = new_model.money
# return True
# return False
# 优化
for item in self.list_restaurant:
if item.rid == new_model.rid:
# item.name = new_model.name
# item.city = new_model.city
# item.remark = new_model.remark
# item.money = new_model.money
# 优化
item.__dict__ = new_model.__dict__
return True
return False
r_view = RestaurantView()
while True:
r_view.display_menu()
r_view.select_menu()