千家信息网

如何正确使用装饰器

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"如何正确使用装饰器",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何正确使用装饰器"吧!一、装饰器的简单定义外层函数返回里层函数的引用,
千家信息网最后更新 2026年11月02日如何正确使用装饰器

本篇内容主要讲解"如何正确使用装饰器",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何正确使用装饰器"吧!

一、装饰器的简单定义

外层函数返回里层函数的引用,里层函数引用外层函数的变量。

二、装饰器的作用

通俗来讲装饰器的作用就是在不改变已有函数代码前提下,为该函数增加新的功能。

def run():    print('我会跑') fun()

现在我想在原有函数的基础上新增一个功能:我会唱歌。这个时候利用装饰器则轻松可以帮我们实现这个功能。

三、实例理解

(1)不传参的装饰器

def outer(fun):    def inner():       fun()  //fun是外层函数的变量,在inner里面用    return inner //inner就是里层函数的引用

(2)传递参数的装饰器:

def func(fun):    def add(*args,**kwarge):       return fun(*args,**kwargs)    return add

现在对于装饰器的基本格式有一定的了解,就可以直接写函数了。下面实现文章开头的 我会唱歌 的功能

def outer(fun):     def inner(*args, **kwarge):         print("我会唱歌")         return fun(*args, **kwarge)     return inner

四、如何使用装饰器

方法一:使用@符号+装饰器的名字   把它放在想要装饰函数的上一行即可 @outer def run():    print('我会跑')     run()   方法二: def run():     print('我会跑')  run=outer(run)   #就等价于@outer run()  最终打印结果是: 我会唱歌 我会跑

如果我想知道fun 传递的参数是什么,在装饰器内部可以使用如下方式:

def outer(fun):     a = 1     def inner(*args, **kwarge): # args是一个数组,kwargs一个字典         print(fun.__name__) #打印fun接收的函数的名字         print("我会唱歌")         return fun(*args, **kwarge)     return inner

但是如果我们 print(run.__name__,6666666) 输出的结果是inner,并不是我们想要的run,这里的函数被warpTheFunction替代了。它重写了我们函数的名字和注释文档(docstring)。解决方法如下:

from functools import wraps  def outer(fun):     @wraps(fun)     def inner(*args, **kwargs):         print(fun.__name__,11111111111)         print("我会唱歌")         return fun(*args, **kwargs)     return inner  @outer def run():    print('我会跑')      print(run.__name__,6666666)  //输出结果为 run 666666

五、自己实现装饰器

  1. def subuser_keymanage(view_func):

  2. '''功能是实现用户管理权限的判定'''

  3. def _wrapper_view(request, *args, **kwargs):

  4. user = request.user #一个Customer对象,包含了用户名/密码等信息

  5. customer = user.customer.customer_id #用户的id

  6. select_status = get_curuser_permission(user=user, customer=customer)#调用函数返回的值有两种0和1

  7. if not select_status:#如果返回0表示没有权限,返回错误码

  8. return render_response(request, ErrorCode.FAILED)

  9. return view_func(request, *args, **kwargs)

  10. return _wrapper_view


@subuser_keymanage  def generate_subuser_ak_sk(request):     params = json.loads(request.body) #获取卡前端传递的参数     user_id_only = params.get("user_id") #获取用户表示id值     中间代码就忽略了......     return render_response(request, ErrorCode.FAILED)

六、装饰器小结

通过装饰器很大程度上可以减少代码的复用,在代码规范中这一点是很重要的。

以上就是装饰器的基本知识,即便没有任何基础,按照作者的思路,套用固定的格式,不需要完全理解,只要按照流程一步一步就能写出高端大气上档次的装饰器了,恭喜你!

前方高能请注意:装饰器传参,三层嵌套函数一般用的比较少,其实也不难,一层一层看,跟上文讲的一样,仅作为知识的拓宽。

  1. import logging

  2. def use_logging(level):

  3. def decorator(func):

  4. def wrapper(*args, **kwargs):

  5. if level == "warn":

  6. logging.warn("%s is running" % func.__name__)

  7. elif level == "info":

  8. logging.info("%s is running" % func.__name__)

  9. return func(*args)

  10. return wrapper

  11. return decorator

  12. @use_logging(level="warn")

  13. def foo(name='foo'):

  14. print("i am %s" % name)

  15. foo()


i am foo WARNING:root:foo is running

到此,相信大家对"如何正确使用装饰器"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

函数 功能 代码 方法 用户 参数 名字 外层 就是 结果 作用 内容 变量 基础 权限 格式 知识 学习 输出 很大 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技有限公司 互联网高科技 南京欣网互联网络科技 上海睿民互联网科技有限公司 河南云网互联网络科技有限公司 没上市的科技互联网公司 中国 科技 互联网 互联网科技排名 苏州互联网科技贷款公司 人人互联网科技是培训 广州慧亚互联网科技怎么样 互联网金融科技公司干啥的 互联网科技公司实习生 新兴科技互联网创新大赛颁奖典礼 保险科技服务互联网营销体系 国大互联网教育科技有限公司薪资 互联网方面的科技前沿 山东子淼互联网科技有限公司 上海创道互联网络科技有限公司 现代互联网科技公司 万易互联网科技 滨湖区互联网智能科技产品供应 青海省互联网新科技 随着互联网科技发展 团飞科技与伯堂互联网服务平台 华服互联网科技官网 互联网科技与管理 互联网公司黑科技创始人 互联网科技实习生岗位 互联网风格科技公司名称
0