🔧 一、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 应用。
💻 四、实战建议
- 学习路径:
- 从原生 MVC 示例起步(如待办事项应用)。
- 进阶使用 Django/Flask 构建 Web 项目。
- MVP 可尝试 PyQt 桌面开发。
- 常见错误:
- MVC 中 View 直接操作 Model(应通过 Controller)。
- MVP 中 Presenter 过于臃肿(需拆分逻辑到 Model)。
可通过 Django 官方教程 或 Flask MVP 示例 进一步实践。