Python 中的MVC与MVP 框架与示例

发布于:2025-06-13 ⋅ 阅读:(19) ⋅ 点赞:(0)

在这里插入图片描述

🔧 一、Python 中的 MVC 框架与示例

1. 原生 Python 实现(控制台应用)
  • 核心组件
    • Model:管理数据逻辑(如读取文件、数据库操作)。
    • View:负责数据展示。
    • Controller:处理用户输入,协调 Model 和 View。
  • 示例代码(待办事项应用):
    # model.py
    class TodoModel:
        def __init__(self):
            self.todos = []
        def add_todo(self, task):
            self.todos.append(task)
    
    # view.py
    class TodoView:
        def show_todos(self, todos):
            for i, task in enumerate(todos):
                print(f"{i+1}. {task}")
    
    # controller.py
    class TodoController:
        def __init__(self):
            self.model = TodoModel()
            self.view = TodoView()
        def add_task(self, task):
            self.model.add_todo(task)
        def display_tasks(self):
            self.view.show_todos(self.model.todos)
    
    # main.py
    controller = TodoController()
    controller.add_task("学习 Python MVC")
    controller.display_tasks()
    
  • 特点:无需框架,适合理解 MVC 本质。
2. Web 框架支持
  • Django(MTV 模式,类 MVC)

    • Model:定义数据模型(ORM)。
    • View:作为控制器,处理业务逻辑。
    • Template:作为视图,渲染 HTML。
    # models.py
    from django.db import models
    class Book(models.Model):
        title = models.CharField(max_length=100)
    
    # views.py
    from django.shortcuts import render
    def book_list(request):
        books = Book.objects.all()
        return render(request, 'books.html', {'books': books})
    
    # books.html(模板)
    <ul>{% for book in books %}<li>{{ book.title }}</li>{% endfor %}</ul>
    
  • Flask(灵活 MVC 支持)

    • 通过路由(Controller) + 模板引擎(View) + 数据类(Model)实现。
    from flask import Flask, render_template
    app = Flask(__name__)
    
    # Model(模拟数据)
    books = [{"title": "Python基础教程"}, {"title": "Flask Web开发"}]
    
    # Controller
    @app.route('/')
    def book_list():
        return render_template('books.html', books=books)
    
    # View(books.html 同 Django 模板)
    

⚙️ 二、Python 中的 MVP 框架与示例

1. MVP 模式的特点
  • Presenter 替代 Controller,完全隔离 View 和 Model
  • View 通过接口与 Presenter 交互,便于单元测试。
2. 示例代码(用户管理应用)
# model.py
class UserModel:
    def get_user(self):
        return {"name": "Alice", "age": 30}

# view.py(定义接口)
class IUserView:
    def show_user(self, user): pass

class UserView(IUserView):
    def show_user(self, user):
        print(f"Name: {user['name']}, Age: {user['age']}")

# presenter.py
class UserPresenter:
    def __init__(self, view: IUserView):
        self.view = view
        self.model = UserModel()
    def update_view(self):
        user = self.model.get_user()
        self.view.show_user(user)

# main.py
view = UserView()
presenter = UserPresenter(view)
presenter.update_view()
3. 框架支持
  • PyQt:桌面 GUI 开发中常用 MVP 模式,View 为 QWidget,Presenter 处理信号。
  • Web 框架(如 Flask + MVP 扩展):需自行实现 Presenter 层,较少现成框架直接支持。

💎 三、关键区别与选择建议

特性 MVC MVP
数据流向 View 可直接监听 Model View 通过 Presenter 与 Model 交互
测试难度 View 与 Model 耦合,测试复杂 View 接口化,易于单元测试
适用场景 Web 框架(Django/Flask) 高测试要求的应用(如金融系统)
选择建议
  • 选 MVC:快速开发 Web 应用(Django/Flask 内置支持)。
  • 选 MVP:需高测试覆盖率或复杂交互的桌面/GUI 应用。

💻 四、实战建议

  1. 学习路径
    • 原生 MVC 示例起步(如待办事项应用)。
    • 进阶使用 Django/Flask 构建 Web 项目。
    • MVP 可尝试 PyQt 桌面开发
  2. 常见错误
    • MVC 中 View 直接操作 Model(应通过 Controller)。
    • MVP 中 Presenter 过于臃肿(需拆分逻辑到 Model)。

可通过 Django 官方教程Flask MVP 示例 进一步实践。