今天写后台接口的登录逻辑的时候,遇到了对登录状态的处理,用户登录之后服务器返回给用户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装饰器的一些理解相关推荐

  1. 对Python装饰器的个人理解方法

    在自己好好总结并对Python装饰器的执行过程进行分解之前,对于装饰器虽然理解它的基本工作方式,但对于存在复杂参数的装饰器(装饰器和函数本身都有参数),总是会感到很模糊,即使这会弄懂了,下一次也很快忘 ...

  2. python装饰器原理-深刻理解python装饰器

    我们要完全理解python装饰器,不是很容易,主要归结有如下困难: 1. 关于函数"变量"(或"变量"函数)的理解 2. 关于高阶函数的理解 3. 关于嵌套函数 ...

  3. python装饰器作用-Python装饰器的通俗理解

    在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...

  4. python装饰器原理-深入理解 Python 装饰器

    作者简介 曾凡伟,携程信息安全部高级安全工程师,2015年加入携程,主要负责安全自动化产品的设计和研发,包括各类扫描器.漏洞管理平台.安全 SaaS 平台等. Python 是一门追求优雅编程的语言, ...

  5. (一)Python装饰器的通俗理解

    在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...

  6. python装饰器的通俗理解_python装饰器的通俗理解

    在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...

  7. python装饰器的通俗理解_简单理解Python装饰器

    Python有大量强大又贴心的特性,如果要列个最受欢迎排行榜,那么装饰器绝对会在其中. 刚接触装饰器,会觉得代码不多却难以理解.其实装饰器的语法本身挺简单的,复杂是因为同时混杂了其它的概念.下面我们一 ...

  8. 什么是python装饰器_深入理解 Python 装饰器

    作者简介 曾凡伟,携程信息安全部高级安全工程师,2015年加入携程,主要负责安全自动化产品的设计和研发,包括各类扫描器.漏洞管理平台.安全 SaaS 平台等. Python 是一门追求优雅编程的语言, ...

  9. python装饰器作用-如何理解Python装饰器?

    晚上失眠,怒上知乎答题! 刚好最近我的python专栏里写过一篇装饰器相关的,不说废话,直接上干货! /> 目录如下:1.装饰器是什么? 2.如何使用装饰器? 3.内置装饰器 一.装饰器是什么? ...

最新文章

  1. 2021-10-27 我与地坛
  2. leetcode-19-删除链表的倒数第N个节点
  3. 【BZOJ1042】硬币购物(动态规划,容斥原理)
  4. latex中report目录_LaTeX目录格式控制
  5. git下载安装、验证、企业实战单机、多人协作
  6. 如何讲商业智能(BI)融入大数据中
  7. sql查询数据库所有表、字、注释
  8. quartz之动态定时器实现
  9. Javascript es6 在线编辑器
  10. Principles of fMRI 1课程笔记7--fMRI数据的时间分辨率和空间分辨率
  11. 蒙特卡洛-马尔科夫链(MCMC)初步
  12. 逻辑回归优化算法总结一
  13. Java GC的标记-清除算法【总结】
  14. linux 格式化 4k对齐,硬盘WD10EARS在FreeNas的格式化方法,4k对齐的问题
  15. RZ7886/7888/7889/7899/TA6586小功率直流电机正反转驱动芯片简介
  16. 【spider】爬虫学习路线-精通Scrapy网络爬虫
  17. WPI交通信号灯数据集格式转换成VOC2007
  18. linux之sudo apt-get install **** 是到哪里下载软件以及下载到哪里去了
  19. 进制数与字符串之间的转换
  20. 通达oa精灵的下载步骤_通达OA精灵2016版官方下载_通达OA精灵2016版电脑版_通达OA精灵2016版20161212-华军软件园...

热门文章

  1. widows 虚拟内存
  2. Linux 文件搜索神器 find 实战详解,建议收藏!
  3. 知网的html查重报告看不了,知网查重没有报告单怎么办?
  4. 有谁可以帮帮忙 帮我写一篇竞聘药店储备店长的演讲稿 急用
  5. 计算机应用如何分段和合并段落,word分段与合并段落的办法
  6. 独家首发! |《小岛区块链》之区块链起源
  7. python BGR 转换为 RGB
  8. 苹果笔记本php好吗,苹果的笔记本好吗 你到底适不适合购买【图文】
  9. Python实现英文文章加密传送,收到后进行解密
  10. 2020年联网设备或超340亿台,为智能硬件企业提供检测服务会是个好生意么?