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

news/2024/2/28 1:20:29
  • 在后续的讲解中,对大家对装饰器的掌握程度要求较高,所以此文来深入讲解一下,有看过《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 + 1000v = 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 functoolsdef 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 wrapsapp = 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')  # 2func()  # 这个函数func是被装饰的函数print('func1')  # 4return 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')  # 1func()  # 这里的func()其实是inner1(),到上面去了print('func2')  # 5return inner2@wrapper2  # f = wrapper2(f)  里面的f==inner1  外面的f == inner2
@wrapper1  # f = wrapper1(f)   里面的f==函数名f  外面的f == inner1
def f():  # 3print('主函数')f()  # inner2()

在这里插入图片描述


http://www.ppmy.cn/news/697987.html

相关文章

如何破解qq仅三天可见

如何破解qq仅三天可见 1、方法一:打开微信的好友列表,将除了你想破解的这个人之外,其他好友的朋友圈都设置为【不看她】的朋友圈。设置完成之后,你的朋友圈只会显示这一个人了,接着打开微信朋友圈,向下刷的…

简单粗暴破解极域课堂之万能密码

极域课堂万能密码:mythware_super_password 直接用万能密码十分的简单粗暴 单击极域课堂 点击设置 弹出此对话框,然后输入万能密码点击确认 弹出这个对话框后点击网络,选择教师登陆,点击确认老师就不能监控你了 当然你也可以选…

Hadoop基础——HDFS知识点梳理

HDFS基础知识 1. 介绍一下HDFS组成架构? 组成部分: HDFS Client,NameNode,DataNodeSecondary NameNode( HA模式下是 StandBy NameNode) Client: 客户端 文件切分,文件上传HDFS时,client将文件切分成一个一个的block&#xff0…

Linux 设置定时任务

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

安兔兔V9版正式公测 热门旗舰机跑分变化很大

3月22号消息,安兔兔宣布安兔兔V9公测版正式发布,目前已经在安兔兔官网以及各大应用商店陆续上架,此次更新新增了一些测试项目,在GPU、CPU、内存和存储部分、UX(用户体验)以及反作弊方面皆有所升级。 为了看…

安兔兔html5评测页面,安兔兔评测(com.antutu.ABenchMark) - 9.0.9-OB - 应用 - 酷安

权限信息 完全的网络访问权限 读取手机状态和身份 查看WLAN连接 查看网络连接 读取您的USB存储设备中的内容 修改或删除您的USB存储设备中的内容 拍摄照片和视频 android.permission.USE_FULL_SCREEN_INTENT 与蓝牙设备配对 关闭其他应用 计算应用存储空间 大致位置…

安兔兔排行榜提取和搜索

手机性能排行榜_安兔兔跑分排行_安兔兔 使用Chrome扩展获取并拼接网页和JS内容&#xff0c;数据存在JS数组中&#xff0c;过滤到新数组中使用&#xff1a; var uls document.getElementsByClassName(tab-content)[0].getElementsByTagName(ul); var s <html>\n<hea…

鸿蒙系统安兔兔排行榜,安兔兔跑分超72万,骁龙870阵营又迎来新“王牌”选手...

不知道大家有没有发现&#xff0c;6月还没进入&#xff0c;618的号角就已经吹响了&#xff0c;其中就包括我们日常必用的手机。或许是因为手机圈的竞争过于激烈&#xff0c;不同品牌新机频发的节奏又让消费者应接不暇&#xff0c;所以对于品牌商而言需要搞出一点新花样&#xf…

安兔兔html5测试果7,安兔兔系统评测

安兔兔系统评测app是一款专门为手机、平板电脑等进行能评测的APP&#xff0c;您可以下载安兔兔评测电脑版来评测您的电脑能&#xff0c;虽然功能高大上&#xff0c;但是操作却是简单易用呢! 安兔兔系统评测app功能&#xff1a; 1.支持自定义测试项目&#xff0c;完成测试后提供…

安兔兔html5测试35000,安兔兔评测 8.4.3 安卓版

安兔兔评测是一款手机评测软件&#xff0c;现在狠多的未发行机都是在安兔兔上面曝光的&#xff0c;看来手机商都比较信赖安兔兔的数据&#xff0c;即使是被爆出来&#xff0c;也不怕数据差。 功能介绍 安兔兔评测是一款专门为智能手机、平板电脑、智能电视等设备评测硬件性能(跑…

安兔兔软件测试手机准确吗,安兔兔验机准吗? 安兔兔验机中心新版使用评测

得益于android系统的开源,如今在android手机市场上出现了多种高仿的假冒智能手机以假乱真,假冒智能手机不论从外观还是操作系统看上去都足以迷惑普通用户,让普通用户难以辨别真伪,鉴于以上安兔兔验机中心的一键验机功能非常的实用。 那么真实的验机状况是怎样的呢?笔者通过…

Java——《面试题——Git篇》

全文章节 Java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程&并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 Java——《面试题——MySQL篇》​​​​​​ Java——《面试题——SpringCloud》 Java——…

BOSHIDA DC电源模块在自动化设备中的应用

BOSHIDA DC电源模块在自动化设备中的应用 DC电源模块是一种用于提供电源的设备&#xff0c;可以将交流电转换为直流电&#xff0c;并提供稳定、可靠的电源输出。在自动化设备中&#xff0c;DC电源模块常用于驱动直流电机、控制电磁阀等各种设备。以下是DC电源模块在自动化设备…

jedis使用,操作Redis数据库2

在刚刚ping通的基础上,再来通过jedis连接池连接redis 在resources下创建redis.properties配置文件,在配置文件中写如下内容 # 必配 # Redis服务器地址(域名或IP) redis.host192.168.40.100 # Redis服务器连接端口(Redis默认端口号是6379) redis.port6379 # Redis服务器连接密码…

内存以字节编址,地址范围为A0000H~CFFFFH,共有多少个字节

问题 某计算机的内存以字节编址&#xff0c;地址范围为A0000H~CFFFFH&#xff0c;共有多少个字节呢&#xff1f;若用存储容量为64K8bit的存储器芯片构成内存&#xff0c;至少需要多少片? 解决 H为16进制标识 地址为CFFFFH-A0000H130000H,转换十进制3*10000H3*16(4次方)3*2(1…

一个16进制的数占多少字节?(半个字节)

问&#xff1a;一个十六进制字符&#xff08;十六进制数字、十六进制位&#xff09;占多少字节&#xff1f; 1个字节是8位&#xff0c;二进制8位&#xff1a;xxxxxxxx 范围从00000000&#xff0d;11111111&#xff0c;表示0到255。一位16进制数&#xff08;用二进制表示是xxxx…

计算机存储单位:bit, Byte, KB, MB, GB, TB, PB, EB, ZB, BB

一、计算机的存储单位有哪些呢&#xff1f;   计算机存储单位一般用 bit, Byte, KB, MB, GB, TB, PB, EB, ZB, BB来表示&#xff0c; 我们经常将Byte简称为B&#xff0c;将KB简称问K。什么几K了&#xff0c;什么几B了。。 二、他们换算关系是怎样的呢&#xff1f;…

计算机科学与技术1k怎么算,1K等于多少个字节?

K是千 M是兆 G是吉咖 T是太拉 8bit(位)1Byte(字节) 1024Byte(字节)1KB 1024KB1MB 1024MB1GB 1024GB1TB 数位组&#xff1a;一个在信息技术和数码技术领域中&#xff0c;用于表示信息的数量的单位。 一个数位组是数个二进位的组合。早期的不同计算机系统中使用的数位组含有的二进…

1byte、1KB、4KB,1MB、1GB用16进制表示的范围。任意地址范围求字节数

请先打开一个在线的2进制转16进制的转换器&#xff0c;便于理解调试。 首先 1个字节1byte8Bit。 字节是计算机信息技术用于计量存储容量的一种计量单位&#xff0c;也表示一些计算机编程语言中的数据类型和语言字符。 1KB 1024byte 2的10次方 byte&#xff0c;转化为16进制…

一个字节代表多少位

一个字节存储8位无符号数&#xff0c;字节是二进制数据的单位&#xff0c;储存的数值范围为0-255&#xff0c;字节是计算机信息技术用于计量存储容量的一种计量单位&#xff0c;表示计算机编程语言中的数据类型和语言字符&#xff0c;字节型态的变数只需要用一个位元组(8位元)的…
最新文章