- 2.8节: Mixin模式
- 已经是最后一篇了
广州番禺Python, Java小班周末班培训
薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:https://www.chipscoco.com/?cate=6
2.9.1 MVC模式
MVC是一种框架设计模式,Tornado框架 ,Django框架(MTV模式)等就是基于MVC的思想来实现的。
M即Model, 指业务模型, 对数据的存储和操作进行了抽象
V即View, 指界面视图,用来处理数据的显示
C即Controller, 指控制器,负责处理具体的业务逻辑,接受用户的输入并调用模型和视图来处理用户的需求
2.9.2 理解MVC
MVC模式将软件解耦为模型,视图,控制器三大模块,每个模块各司其职,这样方便维护和重用,也便于团队成员进行合作:前端工程师专注于界面的显示和交互,后端工程师专注于处理业务逻辑。
2.9.3 源码实现
# __author__ = 薯条老师,微信公众号:薯条编程
"""
MVC模式将软件解耦为模型,视图,控制器三大模块,每个模块各司其职,这样方便维护和重用
"""
from urllib.parse import urlparse
import abc
"""
(1) 定义抽象基类Model,表示MVC中的Model:模型对数据的存储和操作进行了抽象
"""
class Model(abc.ABC):
@classmethod
def get(cls, **kwargs):
pass
"""
(2) GoodsModel是一个具体的模型子类,封装了商品数据的存储和获取操作
"""
class GoodsModel(Model):
GOODS = {
1: {"name": "洗发水", "price": 22},
2: {"name": "牙膏", "price": 15},
3: {"name": "宠物绳", "price": 29},
4: {"name": "面包", "price": 16},
5: {"name": "啤酒", "price": 8},
6: {"name": "咖啡", "price": 30},
}
@classmethod
def get(cls, **kwargs):
if "pk" in kwargs:
return GoodsModel(kwargs["pk"])
def __init__(self, pk):
self.__data = [] if pk not in self.GOODS else [self.GOODS[pk]]
@property
def data(self):
return self.__data
"""
(3) 定义抽象基类View,表示MVC中的View,提供了数据显示的抽象接口
"""
class View(abc.ABC):
@staticmethod
def show(data):
""" """
"""
(4) GoodsView是View的具体子类,负责将商品数据以表格的形式来展示
"""
class GoodsView(View):
@staticmethod
def show(goods):
"""
:param goods: e.g:{"name": "洗发水", "price": 22}
:return:
"""
tr = "+" + "-" * 5 + "+" + "-" * 16 + "+" + "-" * 10 + "+"
heading = "|{:^8s}|{:^18s}|{:^9s}|".format("id", "商品名", "售价")
print(tr + "\n" + heading + "\n" + tr)
for id_, data in enumerate(goods):
print("|{0:^8s}|{1:{3}^8s}|{2:^10s}|".format(str(id_+1), data["name"],
str(data["price"]), chr(12288)))
print(tr)
"""
(5) 定义抽象基类RequestHandler,表示MVC中的控制器,
负责处理具体的业务逻辑,接受用户的输入并调用模型和视图来处理用户的需求
"""
class RequestHandler(abc.ABC):
@abc.abstractmethod
def get(self, **kwargs):
pass
"""
(6) GoodsDisplayHandler用来处理商品数据显示的具体业务逻辑
"""
class GoodsDisplayHandler(RequestHandler):
def get(self, **kwargs):
if "goods_id" in kwargs:
goods_model = GoodsModel.get(pk=int(kwargs["goods_id"]))
GoodsView.show(goods_model.data)
def __call__(self, **kwargs):
method = None if "method" not in kwargs else kwargs["method"]
if method == "GET":
self.get(**kwargs)
if __name__ == "__main__":
urlpatterns = {"/goods/": GoodsDisplayHandler}
url = "https://www.chipscoco.com/goods/?goods_id=1"
parse_result = urlparse(url)
short_url = parse_result.path
params = {}
for item in parse_result.query.split("&"):
param = item.split("=")
params[param[0]] = param[1]
if short_url in urlpatterns:
handler = urlpatterns[short_url]
params["method"] = "GET"
handler()(**params)2.9.4 最具实力的小班培训
薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。
(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,包拿Offer
(3) 数据分析高薪就业班,月薪11K-15K, 免费领取课程大纲
(4) Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲
扫码免费领取Python学习资料:

- 2.8节: Mixin模式
- 已经是最后一篇了


