Python系统学习1-9-类二之MVC框架

一、模型说明

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内存图

Python系统学习1-9-类二之MVC框架_第1张图片

四、案例继续深化学习 

"""
    疫情信息管理系统
        学习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()

你可能感兴趣的:(python基础学习,python,学习,mvc)