装饰器的作用:在不改变原函数的情况下给函数增加功能!

装饰器由闭包和语法糖组成

闭包:即两个函数嵌套,外部函数返回内部函数的引用,外部函数一定会传入参数,外部函数起的是交换引用的作用:把要装饰的参数(也就是装饰前的函数)与 装饰后的函数的引用对换,而里层的函数做的是执行操作,调用原函数就是在这里执行的!

#闭包模型
#外函数
def set_fun(func):
    def call_fun( *args, **kwargs):
#里函数
#。。这里可作为要执行原函数前执行的代码段,比如验证功能。。
        result = func(*args, **kwargs)
#这里可以对原函数的执行结果做筛选
        return result

return call_fun

2.语法糖:

@set_fun # @这个就是语法糖,可以理解为:set_fun ===>test = set_fun(test)
def test():
    print("啦啦啦!我是要装饰的原函数!^_^")

#下面说一种特殊三重装饰器,也就是给装饰器传参
def set_args(args):
print("args%s"%str(args))

def set_fun(func):
print("set_fun")
def call_fun(*args,**kwargs):
print("call_fun")
return func(*args,**kwargs)
return call_fun
return set_fun

@set_args(123)  # 1.set_args(123) 2. @set_fun====>test = set_fun(test)
def test():
    print("test is show")

test()

装饰器的应用场景很多:比如python里的定义类方法和静态方法就是用的装饰器:

class A(object):
    
    @classmethod
    def show_a(self):
        pass
    
    @staticmethod
    def show_b():

pass

还有就是Django与flask的网页路由也是用的装饰器的原理去实现:

@api.route('/send_sms_code',methods=["POST"])

pass

下面说一下装饰器在一种特殊的情况下:

我曾经在一个flask的项目的时候出现过一个异常,那时候我写了一个装饰器去处理多个视图函数的效验登陆状态的问题,然后出现了一个异常:

AssertionError: View function mapping is overwriting an existing endpoint function: api_1_0.wraaper

这个异常出现的原因是因为一个模块下的多个视图函数同时使用这个装饰器,然后这几个视图函数之间的数据产生了互相影响,最后我用functools模块下的wraps去消除这种影响!

from functools import wraps
def login_required(view_func):
    """自定义装饰器判断登陆状态
    使用装饰器装饰函数时,会修改被装饰的函数的__name属性和被装饰的函数的说明文档
    为了不让装饰器影响被装饰的函数的默认的数据,我们会使用@wraps装饰器,提前对view_funcJ进行装饰
    """
    @wraps(view_func)
    def wraaper(*args, **kwargs):
        """判断用户登录的逻辑"""
        user_id = session.get('user_id')
        if not user_id:
            return jsonify(code=RET.SESSIONERR, codermsg='用户未登录')
        else:
            
            g.user_id = user_id
            # 执行被装饰的视图函数
            return view_func(*args, **kwargs)
    return wraaper

装饰器我在很多第三方的源码里都看到它的身影,它的强大可见一斑!

python三大神器之一装饰器相关推荐

  1. python三层装饰器-python三大神器===》装饰器

    1.认识装饰器 如果你经常看我的博客,你已经学会了python的前两大"神器'(迭代器,生成器),那么什么是装饰器呢?就如字面意义装饰器是对某个事物(通常指函数)进行装饰,让其在不修改任何内 ...

  2. python三大神器===》装饰器

    1.认识装饰器 如果你经常看我的博客,你已经学会了python的前两大'神器'(迭代器,生成器),那么什么是装饰器呢?就如字面意义装饰器是对某个事物(通常指函数)进行装饰,让其在不修改任何内部代码的情 ...

  3. python三大神器之装饰器

    装饰器的形成过程 假如你要写一个计算函数执行时间的函数,代码如下: 1 import time 2 3 def func1(): 4 print('in func1') 5 6 def timer(f ...

  4. 什么是装饰器 python_python三大神器===》装饰器

    1.认识装饰器 如果你经常看我的博客,你已经学会了python的前两大'神器'(迭代器,生成器),那么什么是装饰器呢?就如字面意义装饰器是对某个事物(通常指函数)进行装饰,让其在不修改任何内部代码的情 ...

  5. python三大器之一——装饰器详解

    python的三大器指的是:装饰器.迭代器.生成器,下面就装饰器整理一下从各种资源收获的对装饰器的理解. 1.理解装饰器之前先要理解函数引用的概念 def func():print("hel ...

  6. python求助神器_【python从零开始(被称之为神器的装饰器)】- 环球网校

    [摘要]假设今天我中了500万,我打算在北京买一个厕所,厕所的功能就是大小便,我觉得需要加点什么,给厕所改造一下,但是要保证厕所的功能,添加一面镜子,再来个热水器,装个喷头.一个三星级厕所打造成功.这 ...

  7. itext生成pdf paragraph 自动换行_reportlab高级制作多格式PDF和python的class和装饰器复习

    1 说明 1.1 reportlab高级制作多格式PDF:即包含文字.表格.柱状图. 1.2 复习python的class和装饰器的高级基础知识. 1.3 列表转换字符串.读取txt文件等python ...

  8. python类装饰器详解-Python类中的装饰器在当前类中的声明与调用详解

    我的Python环境:3.7 在Python类里声明一个装饰器,并在这个类里调用这个装饰器. 代码如下: class Test(): xx = False def __init__(self): pa ...

  9. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  10. python return用法_初学Python要了解什么 装饰器知识汇总有哪些

    初学Python要了解什么?装饰器知识汇总有哪些?在Python学习过程中,有多种方法对函数和类进行加工,相对于其它方式,装饰器语法简单,代码可读性高.因此,装饰器在Python项目中有广泛的应用,比 ...

最新文章

  1. java spring怎么运行_java – 如何使用spring异步运行方法?
  2. Qt Creator创建UI
  3. 利用SqlBulkCopy插入数据
  4. python列表字符串转数字_python 将列表中的字符串转为数字
  5. 【Git】Git处理新Repository无法push的问题
  6. (10)vue.js 指令(2)
  7. 在矩池云上复现 PaddleGAN 照片转油画风格教程
  8. 用计算机视觉为房屋估值,这家美国AI公司堪称保险业的谷歌地球
  9. shell-脚本入门【转】
  10. Android混淆编译Proguard
  11. ASP.NET---动态生成Word文档
  12. 用来这么久的计算机,你是否对计算机中有关数及编码有掌握的呢???那么它来了,让你充分认识计算机有关数和编码的知识~~
  13. android 连接魅族调试,魅族 PRO6 开启USB调试模式
  14. 计算机excel数据标签,excel散点图数据标签,Excel如何设置散点图标签
  15. Transformer模型简介
  16. Git cherry-pick 指令总结
  17. windows os x linux比较,windows、Linux与OS X相比,哪个系统更适合写代码?
  18. 我们怎么保证软件开发的质量?
  19. 10分钟学会 Qt 扁平化界面(qss 使用)
  20. echarts制作多个纵轴的折线图

热门文章

  1. Python使用requests设置headers、cookies实现猫眼实时电影票房排行榜爬取
  2. BP神经网络综合评价法
  3. WPS word文档_页眉页脚横线的添加和删除
  4. FineReport 参数查询
  5. IPv4(分类编址)
  6. 浅谈C++中的LPVOID类型
  7. 个人云盘:阿里云无影,百度网盘、腾讯微云争霸?
  8. [BZOJ2286] [Sdoi2011]消耗战
  9. 高中数学对计算机,对高中数学计算机学习技巧的探讨
  10. 2021年最新版裁判文书逆向