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

news2024/12/24 3:42:56

一、模型说明

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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/890798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汇川脉冲伺服SV630P常用参数设置(博途PLC脉冲输出控制)

有关博途PLC脉冲输出控制功能块详细介绍,请查看下面博客链接: 博途1200PLC轴控功能块(脉冲轴)_博图 轴控块_RXXW_Dor的博客-CSDN博客STRUCT// 轴使能// 轴正向点动// 轴反向点动// 轴回原// 轴复位// 轴暂停// 轴快速停机// 轴绝对定位// 轴相对定位// 轴匀速运行// 修改轴参…

Dubbo基础学习

目录 第一章、概念介绍1.1&#xff09;什么是RPC框架1.2&#xff09;什么是分布式系统1.3&#xff09;Dubbo概述1.3&#xff09;Dubbo基本架构 第二章、服务提供者(直连)2.1&#xff09;目录结构和依赖2.2&#xff09;model层2.3&#xff09;service层2.4&#xff09;resources…

Java课题笔记~ 日期处理

2.8 日期处理 2.8.1 日期注入 日期类型不能自动注入到方法的参数中。需要单独做转换处理。 使用DateTimeFormat注解&#xff0c;需要在springmvc.xml文件中添加mvc:annotation-driven/标签。 &#xff08;1&#xff09;在方法的参数上使用DateTimeFormat注解 RequestMappi…

浅谈SPA

1. 基本概念 ● SPA(single-page application) 单页应用,默认情况下我们编写Vue,React都只有一个html页面并且提供一个挂载点,最终打包后会在此页面中引入对应的资源.(页面渲染全部由js动态进行渲染).切换页面时通过监听路由变化,渲染对应的页面(client side rendering,客户端…

探秘分布式大数据:融合专业洞见,燃起趣味火花,启迪玄幻思维

文章目录 一 数据导论二 大数据的诞生三 大数据概论3.1 大数据的5V特征3.2 大数据的工作核心 四 大数据软件生态4.1 数据存储软件4.2 数据计算软件4.3 数据传输软件 五 Apache Hadoop概述5.1 Apache Hadoop框架5.2 Hadoop的功能5.3 Hadoop的发展5.4 Hadoop发行版本 一 数据导论…

使用Python批量将Word文件转为PDF文件

说明&#xff1a;在使用Minio服务器时&#xff0c;无法对word文件预览&#xff0c;如果有需要的话&#xff0c;可以将word文件转为pdf文件&#xff0c;再存储到Minio中&#xff0c;本文介绍如果批量将word文件&#xff0c;转为pdf格式的文件&#xff1b; 安装库 首先&#xff…

由于找不到msvcp140.dll无法继续执行代码是什么原因

使用计算机过程中&#xff0c;有时会遇到一些错误提示&#xff0c;其中之一就是关于msvcp140.dll文件丢失或损坏的错误。msvcp140.dll是Windows系统中非常重要的文件&#xff0c;是Microsoft Visual C Redistributable中动态链接库的文件&#xff0c;如果缺失或损坏&#xff0c…

Git 入门到熟悉

一、版本控制 1.1 什么是版本控制 版本控制&#xff08;Revision control&#xff09;是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史&#xff0c;方便查看更改历史记录&#xff0c;备份以便恢复以前的版本的软件工程技术。简单说就是用于管理多人协同开…

管理类联考——逻辑——真题篇——按知识分类——汇总篇——一、形式逻辑——三段论——第二节 规则

文章目录 第二节 三段论-规则题-三段论-规则-补前提-“特推特&#xff0c;否推否&#xff0c;两特两否无结论”得前提是“有的/所有”→所有概念出现两次→中项要周延。题-三段论-规则-补前提-“特推特&#xff0c;否推否&#xff0c;两特两否无结论”得前提是“有的/所有”→…

css 文字排版-平铺

序&#xff1a; 1、表格的宽度要有&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 2、容器不能是display:inline 3、扩展---》node全栈框架 代码 text-align-last: justify; width: 70px; display: inline-block; 主要是用于表单左侧文字排序&#xff01;

AI如何看待能力,学历,文凭

1 假设&#xff1a; {文凭}⊂{学历}⊂{能力} 2 证明&#xff1a; 首先&#xff0c;我们需要明确这些集合的定义和关系。 {能力}是一个包含各种能力的集合&#xff0c;例如学习能力、沟通能力、创新能力、领导能力和专业技能等。 {学历}是一个包含各种学历的集合&#xff0c…

ps安装找不到msvcp140.dll,分享msvcp140.dll丢失三个修复方法

当在安装PS&#xff08;Adobe Photoshop&#xff09;时遇到找不到msvcp140.dll的错误提示时&#xff0c;我首先感到有些困惑&#xff0c;因为这个错误可能会影响我使用某些程序或软件。但是&#xff0c;通过尝试不同的修复方法&#xff0c;我发现问题可以得到解决。 首先缺失ms…

Linux多线程【初识线程】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、什么是线程&#xff1f;1.1、基本概念1.2、线程理解1.3、进程与线程的关系…

[oneAPI] Neural Style Transfer

[oneAPI] Neural Style Transfer oneAPINeural Style Transfer特殊环境定义使用包加载数据Neural Style Transfer模型与介绍训练过程结果 比赛&#xff1a;https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517 Intel DevCloud for oneAPI&#xff1a;https://devcl…

1609.奇偶数

目录 一、题目 二、代码 三、完整测试代码 一、题目 1609. 奇偶树 - 力扣&#xff08;LeetCode&#xff09; 二、代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0),…

【大数据Hive】hive 事务表使用详解

目录 一、前言 二、Hive事务背景知识 hive事务实现原理 hive事务原理之 —— delta文件夹命名格式 _orc_acid_version 说明 bucket_00000 合并器(Compactor) 二、Hive事务使用限制 参数设置 客户端参数设置 客户端参数设置 三、Hive事务使用操作演示 操作步骤 客…

电脑msvcr120.dll丢失怎么修复,msvcr120.dll怎么安装?

msvcr120.dll是Microsoft Visual C Redistributable的一部分&#xff0c;它是Windows操作系统中的一个动态链接库文件。这个文件包含了一些用于C编程的函数和资源&#xff0c;它们被许多应用程序用于提供特定的功能和服务。如果你在运行某个程序时遇到了缺少msvcr120.dll的错误…

AlexNet中文翻译

ImageNet classification with deep convolutional neural networks 原文链接&#xff1a;https://dl.acm.org/doi/abs/10.1145/3065386 目录 使用深度卷积神经网络进行 ImageNet 分类 摘要 1 简介 2 数据集 3 架构 3.1 ReLU非线性 3.2 多GPU上的训练 3.3 局部响应标准化 3.4 重…

centos安装elasticsearch7.9

安装es 下载elasticsearch安装包解压安装包,并修改配置文件解压进入目录修改配置文件 添加用户&#xff0c;并修改所有者切换用户&#xff0c;运行es如何迁移旧版本的数据 下载elasticsearch安装包 下载地址如下&#xff0c;版本号可以替换成自己想要的。 这里需要注意一点&am…