关于Python装饰器的一些理解
今天写后台接口的登录逻辑的时候,遇到了对登录状态的处理,用户登录之后服务器返回给用户token,用户每次调用需要登录的API的时候,就可以根据这个token判断用户是否登录,登录是否过期啥子的了。但是每个路由都对token进行一次验证着实太麻烦了,,而我在java中知道有装饰者模式可以解决这个问题,,所以我查了下,发现python的装饰器也可以解决,而且它也是一个非常重要的东西,所以我就学了下,这里把自己目前的理解写出来,做个记录,纪念我充实的一天。。。。。。
准备知识
1.python函数中可以创建函数
对,没错,就是函数中创建函数,理论上可以一直嵌套
def test():print("来做个加法叭")x=1y=2def add(a,b):return a+bprint(add(x,y))test()
结果:
2.一切皆为对象,函数也是
顾名思义,一切都是对象,函数也是!
def test():return "一切都是对象!"a = test
print(type(a))
print(a())
结果:
我们把函数test()当成对象赋给了a,可以发现,我们执行a时和执行test时,没啥区别。
3.函数可以当成参数
由上面可以知道,一切都可是对象,函数也是,,所以函数也可以当成别的函数的参数啦
def wrap(fun):print("嘿嘿,我在fun前面执行")print(fun())print("嘿嘿,我在fun后面执行")def my():return "我就是一个卑微的被当成参数的函数"wrap(my)
结果:
装饰器基本功能
装饰器的功能嘛,就是装饰用的呗,你看,一般的照片不都有个框子把它装起来么,框子上面都有花边撒,花边就是装饰用的。装饰器也是一样的,当你的函数执行之前要处理或者验证啥子事情的时侯,就可以用装饰器来标记啦。
就拿我开头说的,,我的每个API的函数执行之前,我都要知道它有没有收到token,,我要是每个函数前面都写一遍认证的代码,,我可能要疯。。所以只要用上装饰器,就ok啦。
装饰器的实现
结合刚刚的准备知识,我们可以发现把那3点特性结合起来,就可以实现装饰器的功能啦
def decorator(fun): #接收要装饰的函数def wrap(): #在decorator中新建wrap函数,来执行逻辑,进行“装饰”print("嘿嘿,我在fun前面执行")print(fun())print("嘿嘿,我在fun后面执行")return wrap #返回这个定义好的函数def my():return "我就是一个卑微的被当成参数的函数"a = decorator(my)
a()
结果
这样,我们就可以说,把my()函数装饰起来了。可是每次都这样写着实麻烦死了。
但是python里有快速的方法实现:@
def decorator(fun): #接收要装饰的函数def wrap(): #在decorator中新建wrap函数,来执行逻辑,进行“装饰”print("嘿嘿,我在fun前面执行")print(fun())print("嘿嘿,我在fun后面执行")return wrap #返回这个定义好的函数@decorator #给my函数加上装饰器decorator
def my():return "我就是一个卑微的被当成参数的函数"my()
结果:
嘿嘿,是不是一样的效果?这样就可以大量的简化我们的代码了。
真是太妙了,简直是妙蛙种子进了米奇妙妙屋——妙到家了。
扩展
装饰器的蓝本规范
from functools import wraps
def decorator_name(f):@wraps(f)def decorated(*args, **kwargs):if not can_run:return "Function will not run"return f(*args, **kwargs)return decorated@decorator_name
def func():return("Function is running")can_run = True
print(func())
# Output: Function is runningcan_run = False
print(func())
# Output: Function will not run
同时它也可以写成类
from functools import wrapsclass logit():def __init__(self,x):print(x)def __call__(self,func):@wraps(func)def wrapped_function(*args, **kwargs):log_string = func.__name__ + " was called"print(log_string)return func(*args, **kwargs)return wrapped_function@logit("你好")
def a():print("AAAAA")a()
这里的__call__是python的类的一种特殊方法,和__init__类似,感兴趣的可以查下。它调用类名()
的时侯触发。
它可以用来打印日志:
class logit():def __init__(self):self.count=0def __call__(self,func):@wraps(func)def wrapped_function(*args, **kwargs):self.count+=1log_string = func.__name__ + " was called,the count is"print(log_string,self.count)return func(*args, **kwargs)return wrapped_function@logit()
def a():print()while True:a()time.sleep(2)
关于Python装饰器的一些理解相关推荐
- 对Python装饰器的个人理解方法
在自己好好总结并对Python装饰器的执行过程进行分解之前,对于装饰器虽然理解它的基本工作方式,但对于存在复杂参数的装饰器(装饰器和函数本身都有参数),总是会感到很模糊,即使这会弄懂了,下一次也很快忘 ...
- python装饰器原理-深刻理解python装饰器
我们要完全理解python装饰器,不是很容易,主要归结有如下困难: 1. 关于函数"变量"(或"变量"函数)的理解 2. 关于高阶函数的理解 3. 关于嵌套函数 ...
- python装饰器作用-Python装饰器的通俗理解
在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...
- python装饰器原理-深入理解 Python 装饰器
作者简介 曾凡伟,携程信息安全部高级安全工程师,2015年加入携程,主要负责安全自动化产品的设计和研发,包括各类扫描器.漏洞管理平台.安全 SaaS 平台等. Python 是一门追求优雅编程的语言, ...
- (一)Python装饰器的通俗理解
在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...
- python装饰器的通俗理解_python装饰器的通俗理解
在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...
- python装饰器的通俗理解_简单理解Python装饰器
Python有大量强大又贴心的特性,如果要列个最受欢迎排行榜,那么装饰器绝对会在其中. 刚接触装饰器,会觉得代码不多却难以理解.其实装饰器的语法本身挺简单的,复杂是因为同时混杂了其它的概念.下面我们一 ...
- 什么是python装饰器_深入理解 Python 装饰器
作者简介 曾凡伟,携程信息安全部高级安全工程师,2015年加入携程,主要负责安全自动化产品的设计和研发,包括各类扫描器.漏洞管理平台.安全 SaaS 平台等. Python 是一门追求优雅编程的语言, ...
- python装饰器作用-如何理解Python装饰器?
晚上失眠,怒上知乎答题! 刚好最近我的python专栏里写过一篇装饰器相关的,不说废话,直接上干货! /> 目录如下:1.装饰器是什么? 2.如何使用装饰器? 3.内置装饰器 一.装饰器是什么? ...
最新文章
- 2021-10-27 我与地坛
- leetcode-19-删除链表的倒数第N个节点
- 【BZOJ1042】硬币购物(动态规划,容斥原理)
- latex中report目录_LaTeX目录格式控制
- git下载安装、验证、企业实战单机、多人协作
- 如何讲商业智能(BI)融入大数据中
- sql查询数据库所有表、字、注释
- quartz之动态定时器实现
- Javascript es6 在线编辑器
- Principles of fMRI 1课程笔记7--fMRI数据的时间分辨率和空间分辨率
- 蒙特卡洛-马尔科夫链(MCMC)初步
- 逻辑回归优化算法总结一
- Java GC的标记-清除算法【总结】
- linux 格式化 4k对齐,硬盘WD10EARS在FreeNas的格式化方法,4k对齐的问题
- RZ7886/7888/7889/7899/TA6586小功率直流电机正反转驱动芯片简介
- 【spider】爬虫学习路线-精通Scrapy网络爬虫
- WPI交通信号灯数据集格式转换成VOC2007
- linux之sudo apt-get install **** 是到哪里下载软件以及下载到哪里去了
- 进制数与字符串之间的转换
- 通达oa精灵的下载步骤_通达OA精灵2016版官方下载_通达OA精灵2016版电脑版_通达OA精灵2016版20161212-华军软件园...