(三)Flask前置知识栈——装饰器

news2024/11/16 9:56:52
  • 在后续的讲解中,对大家对装饰器的掌握程度要求较高,所以此文来深入讲解一下,有看过《Python全栈系列教程》专栏的小伙伴可能会说,装饰器已经出过文章讲的很详细了。饶是如此,深究过装饰器的小伙伴们就权当复习一遍,同时,本篇文章会有所拓展哦~

  • 在继续之前,请确保您对函数和闭包的概念有一定的了解,因为这些是理解装饰器的基础知识。详见:《20.Python函数(五)【函数式编程 上半篇】》和《21.Python函数(六)【函数式编程 下半篇】》。

深究Python——装饰器

三个问题:

  1. 什么是装饰器?
  2. 手写装饰器?
  3. 装饰器都在哪里使用过或者说是见到过?

1. 什么是装饰器?

或者说为什么要用装饰器?

  • 在 Python 中,装饰器是一种特殊的语法,为已有的对象添加额外的功能。装饰器本质上是一个 Python 函数或者类,它可以将其它函数或类作为参数或者返回值。装饰器的作用是在不改变被装饰对象源代码的情况下,添加额外的功能。

使用装饰器的好处:

  1. 代码重用:装饰器可以在多个函数或类之间重复使用,避免代码冗余。

  2. 动态增加功能:通过装饰器,可以在运行时动态地给对象增加新的功能或修改已有功能。例如,在 Flask 中,很多常见的功能都是通过装饰器实现的,比如身份验证、路由注册等。

  3. 简化代码结构:装饰器可以将一些通用的代码逻辑抽象出来,避免在每个函数中都写一遍相同的代码。这样可以让代码结构更清晰,易于维护。

  4. 提高代码可读性:装饰器可以把一些额外的逻辑和代码与源代码分离,让源代码更加简洁易懂。

  5. 解耦代码:通过装饰器,可以将不同的逻辑分离,减少代码之间的耦合。

  • 总之,装饰器是 Python 中非常强大和灵活的一种功能,可以简化代码结构、提高代码可读性和可维护性,并在不改变源代码的情况下为代码动态增加新的功能。因此,装饰器非常流行,在 Python 中被广泛使用。

2. 手写装饰器?

  • 下面是一个基础的函数:
def index(a1):
    return a1 + 1000

# 执行函数
v = index(2)
print(v)
# 获取函数名
print(index.__name__)

在这里插入图片描述

  • 手写装饰器:
# 装饰器
def wapper(func):
    def inner(*args, **kwargs):
        return func(*args, **kwargs)
    return inner
  • 使用装饰器:
"""
@语法糖的作用:
1.看见@wrapper,执行wapper函数,并将被装饰的函数当做参数传递进去,即 wapper(index)
2.将第一步的返回值,重新赋值给 新index = wapper(老index)
"""


# 使用
@wapper 
def index(a1):
    return a1 + 1000


v = index(999)
print(v)
print(index.__name__)   # 这里输出就不是index而是inner了,说明了上述说的第二步,即函数被重新赋值了
  • 引出一个问题:
@wapper
def index(a1):
    return a1 + 1000

@wapper
def order(a1):
    return a1 + 1000

# 下面输出都是inner
print(index.__name__)
print(order.__name__)
  • 触发需求——当函数被装饰后,依然想通过__name__获取原函数的名字?

  • 解决方法——在装饰器中使用内置的functools.wraps()

import functools


def wapper(func):
    @functools.wraps(func)
    def inner(*args, **kwargs):
        return func(*args, **kwargs)
    return inner
    
# 将装饰器改成这样之后,上面那俩输出一个是index,一个是order

functools.wraps()这个装饰器的实现原理:

  • 首先,每个函数都有自己的元信息(函数名/注释等),而functools.wraps()装饰器就会将原来函数(func)的元信息赋值给函数(inner)。

3. 装饰器都在哪里使用过或者说是见到过?

毋庸置疑,在这个专栏里写这篇文章,那就是Flask里使用过装饰器。其实前面每次注册路由,不都是用的装饰器吗?

  • 直接看Flask中使用自定义装饰器:
from flask import Flask
from functools import wraps

app = Flask(__name__)


def wapper(func):
    @wraps(func)
    def inner(args, **kwargs):
        print('before')
        return func(args, **kwargs)
    return inner


@app.route('/xxx')
@wapper
def index():
    return 'Index'


@app.route('/aaa')
@wapper
def order():
    return 'Order'


if __name__ == '__main__':
    app.run()

注意点:

  1. 为了保证请求每次进来,装饰器都能执行,所以加的装饰器一定要在route下面;
  2. endpoint默认为函数名,不能有同名的(会报错),所以一定要使用functools的wraps装饰器。

装饰器——进阶:

下面是网上摘录的一段代码,看看你能否看懂为何会是这种输出顺序(里面附带注释):
欢迎在评论区留下你的思考痕迹~
【感觉有必要多出几篇,深入讲一下装饰器,敬请期待~】

def wrapper1(func):  # func ==  f函数名    #哪个糖靠近被装饰函数,哪个语法糖函数就先执行,但是内部的inner却后执行
    print('进入wrapper1了')

    def inner1():
        print('inner1')  # 2
        func()  # 这个函数func是被装饰的函数
        print('func1')  # 4

    return inner1  # @wrapper1最后一句f==inner1和@wrapper2后第一句f=wrapper2(f),变量替换,inner1 = wrapper2(f),这样就执行下面的装饰器函数了


def wrapper2(func):  # func == inner1   上面返回一个inner1 = wrapper2(f)
    print('进入wrapper2了')

    def inner2():
        print('inner2')  # 1
        func()  # 这里的func()其实是inner1(),到上面去了
        print('func2')  # 5

    return inner2


@wrapper2  # f = wrapper2(f)  里面的f==inner1  外面的f == inner2
@wrapper1  # f = wrapper1(f)   里面的f==函数名f  外面的f == inner1
def f():  # 3
    print('主函数')


f()  # inner2()

在这里插入图片描述

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

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

相关文章

荣耀笔记本怎么重装Win10系统?荣耀笔记本用U盘重装系统Win10教程

随着时间的推移,荣耀笔记本系统可能会变得缓慢、不稳定,甚至出现故障,这时候,重装操作系统就成为了一个必要的选择,那么怎么给荣耀笔记本电脑重装Win10系统呢,可以按照系统之家小编分享的荣耀笔记本用U盘重…

提升矿井水质安全性:矿井水除氟领域的应用与优势

引言 随着工业化进程的推进,矿井水中含有过量的氟离子已成为一个严重的环境问题。高浓度的氟离子对人体健康和生态环境都具有危害。因此,矿井水除氟工艺的研究和应用变得至关重要。 当废水中的氟超标超过了环保标准时,可能会对环境和人类健康…

【AUTOSAR】VCU开发实际项目讲解(一)----VCU系统边界条件

VCU系统边界条件 VCU基本性能参数 序号 项目 参考指标 试验方法或评定指标 1 外形尺寸 长244mm*宽156mm*41.4mm(参考尺寸) 2 工作电压 正常工作电压 9V-16V CAN通讯电压 8V-18V 不保证功能 <8V or >18V 3 过压保…

基于深度学习的高精度老虎检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度老虎检测识别系统可用于日常生活中或野外来检测与定位老虎目标,利用深度学习算法可实现图片、视频、摄像头等方式的老虎目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

host碰撞,利用host碰撞突破访问边界

文章目录 host 碰撞漏洞原理漏洞利用步骤漏洞复现 host 碰撞 直接利用ip访问显示的是403 404 400 500,但是用域名请求就会返回正常业务。当然在排除WAF作祟下(有一些WAF它会要求使用域名访问,使用IP的会出现WAF的拦截界面)&#…

记录node.js+vue-elementui-admin的后台管理系统登录传参问题

前言:本来想用Node做后端,vue-element-admin做前端来练习一下技术,了解一下开发的过程 // 用户登录处理函数 exports.login (req, res) > {console.log(req.body)const userinfo req.bodyconst sql select * from user where username…

迪赛智慧数——柱状图(象形动态图):高考填报专业考虑的因素

效果图 填报志愿是高考后的一大重要环节,你的职业生涯就在这里起航了。那么,应该怎么填报志愿呢?高考填报专业考虑的因素很多,过半的人会考虑专业就业前景及薪资,其次是个人兴趣和是否为双一流建设学科。 数据源&…

Spring中bean使用方法

Spring框架是一个非常重要的开发工具,它提供了丰富的功能和模块,其中核心的概念之一就是Spring Bean。Spring Bean是Spring IoC容器中的一个对象,它负责管理一个Java对象的生命周期以及依赖注入。下面我将通过互联网场景下的相关背景内容来阐…

[SSM]MyBatis基础

目录 一、MyBatis概述 1.1框架(framework) 1.2三层架构 1.3JDBC的不足 1.4了解MyBatis 二、MyBatis入门程序 2.1resources目录 2.2开发步骤 2.3从XML中构建SqlSessionFactory 2.4mybatis中有两个主要的配置文件 2.5关于第一个程序的细节 2.6关…

Linux read的核心函数generic_file_buffered_read

内核:5.9.0 流程图 generic_file_buffered_read一种调用路径(cat某个文件触发): #0 ondemand_readahead (mapping0xffff888005c61340, ra0xffff888005927598, filp0xffff888005927500, hit_readahead_markerfalse, index0, req…

Linux历史及环境搭建(VMware搭建CentOS7环境以及使用XShell连接Vmware)

Linux历史及环境搭建 1.Linux历史1.1 UNIX发展的历史1.2 Linux发展历史1.2.1 开源1.2.2 官网1.2.3 发行版本 2.VMware配置CentOS7环境2.1 CentOS下载2.2 配置环境2.3 切换国内阿里源2.4 无图形化界面开机2.5 使用XShell连接VMware 结语 1.Linux历史 在这里简要介绍Linux的发展…

全局配置cnpm淘宝镜像

node是一个非常好用的项目管理工具 但这是一个国外的工具 我们直接执行npm命令因为是用的国外的镜像 会比较慢 那么 我们就可以用cnpm来处理 但前提是你要搭建好环境 我们先打开终端 安装 淘宝镜像 输入 npm install -g cnpm --registryhttps://registry.npm.taobao.org然后 n…

最强DETR+YOLO,三阶段目标检测器DEYOv2正式发布,性能炸裂!

导读 目标检测算法是CV领域非常重要的算法,去年二阶段DEYO的发布,提出了很多的创新点,而本文端到端的 论文链接:https://arxiv.org/pdf/2306.09165.pdf 本文提出了一种称为DEYOv2的新型目标检测器,这是第一版DEYO(DETR with YOLO)模型的改进版本。与前代类似,DEYOv2采…

企企通创始人CEO徐辉:数字生态与数字化供应链如何连通

6月16日,2023年华映资本年度大会在杭州成功举办。 2023年华映资本年度大会以“无限新成皆繁星”为主题。在为期一天的峰会中,华映资本合伙人团队、投资团队、华映资本被投企业创始人以及行业嘉宾等50位嘉宾汇聚一堂,既探讨行业当下科技强共识…

硬件可信方案-EVITA HSM

信息安全中的HSM 和 SHE 两个概念有什么区别和相同的地方? HSM,硬件安全模块,Hardware Security ModuleSHE,安全硬件扩展,Secure Hardware Extension EVITA研究项目的目标是为汽车车载网络设计、验证一个体系架构&am…

STM32单片机双通道FM调频数字音量收音机可存台音量可调TEA5767

实践制作DIY- GC0148---双通道FM调频数字音量收音机 基于STM32单片机设计---双通道FM调频数字音量收音机 二、功能介绍: STM32F103C系列最小系统板TEA5767 收音机模块LCD1602显示器喇叭功放模块数字电位器多个按键(存储、S1、S2、S3、频率-0.1MHz、频率…

【AUTOSAR】VCU开发实际项目讲解(二)----VCU软件与结构描述

VCU软件描述 VCU软件架构主要分为底层软件驱动和应用层控制策略,其中应用层控制策略通过基于模型的开发,自动生成代码并可与底层驱动软件实现无缝连接。 VCU软件通过BOOTLOADER和CAN总线进行更新刷写。 标定及诊断 支持CCP/XCP标定协议支持UDS诊断协议及…

聊一聊分布式会话的解决方案

1、传统Session 1、传统session的概述 1、认证过程 1、用户向服务器发送用户名和密码。 2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。 3、服务器向用户返回一个 session_id&#xff…

电子会议桌卡

一、产品描述 采用电子墨水显示屏作为显示屏,取代传统的纸质或LCD铭牌,高科技的外观设计和节能的显示解决方案,结合网络和移动APP,为用户提供更便捷的会议工作服务。 电子铭牌具有环保、节能、操作方便、实用范围广等特点。 本…

MAMP 无法启动 servers 问题

如果你是window10系统,在下载MAMP安装这个软件后,启动,报错,如下所示 [Tue Dec 01 00:52:15 2020] [warn] Init: Session Cache is not configured [hint: SSLSessionCache] [Tue Dec 01 00:52:16 2020] [warn] pid file D:/software/MAMP/bin/apache/logs/httpd.pid overwritt…