带参数的装饰器的应用:

比如有一个函数,只有在对有许可权限的用户开放,执行此函数的用户没有在认证列表里的,就不会执行这个函数。这个该如何实现呢?如下:

 1 def check(allow_users):
 2     def inner_check(fn):
 3         def wrap(username,*args,**kwargs):
 4             '''This is wrap'''
 5             if username in allow_users:
 6                 return fn(username,*args,**kwargs)
 7             return "You are illegal users"
 8         return wrap
 9     return inner_check
10
11
12 @check(['zhaochj','zcj'])
13 def private(username):
14     '''The authentication'''
15     return "You are legitimate users"

1 private('zhaochj')
2 'You are legitimate users'

1 private('tom')
2 'You are illegal users'

这样就可以对调用函数进行身份验证

python中一个函数有一些属性是函数本身具有的,比如__name__属性是查看函数名称,如果一个函数被装饰器装饰过后,这个函数的这些属性会发生怎样的变化呢?

以上边的check装饰器和private函数为例子,如下:

1 private.__name__
2 'wrap'

private函数的名称是wrap了,这是怎么回事?上边已经说过,这里的private函数被装饰器装饰后它已不再是原来的private函数,private这个函数名称会被指向到wrap这个函数对象,那当然用上边的private.__name__查看函数的属性就会是wrap函数的属性。

那怎样来修正呢?可以这样做,如下:

 1 def check_1(allow_users):
 2     def inner_check(fn):
 3         def wrap(username,*args,**kwargs):
 4             '''This is wrap'''
 5             if username in allow_users:
 6                 return fn(username,*args,**kwargs)
 7             return "You are illegal users"
 8         wrap.__name__ = fn.__name__
10         return wrap
11     return inner_check
12
13 @check_1(['zhaochj','zcj'])
14 def private_1(username):
15     '''The authentication'''
16     return "You are legitimate users"

1 private_1.__name__
2 'private_1'

通过在装饰器把__name__重新赋值后就能更正这个问题,但对一个函数来说像__name__这样类似的属性有许多,如果都是这样手工来修正显然是不现实的,所以python提供了一个wraps装饰器来自动修正这个问题,wrapsfunctools这个包中,所以可以这样来修正这个问题,如下:

 1 import functools
 2
 3 def check_1(allow_users):
 4     def inner_check(fn):
 5         @functools.wraps(fn)
 6         def wrap(username,*args,**kwargs):
 7             '''This is wrap'''
 8             if username in allow_users:
 9                 return fn(username,*args,**kwargs)
10             return "You are illegal users"
11         return wrap
12     return inner_check
13
14 @check_1(['zhaochj','zcj'])
15 def private_1(username):
16     '''The authentication'''
17     return "You are legitimate users"

1 private_1.__name__
2 'private_1'

@functools.wraps(fn)这个装饰器相当于执行了wrap.__name__ = fn.__name__这样的操作

转载于:https://www.cnblogs.com/tianshug/p/10921944.html

python装饰器系列(五)相关推荐

  1. python response重头开始_你必须学写 Python 装饰器的五个理由

    你必须学写Python装饰器的五个理由 ----装饰器能对你所写的代码产生极大的正面作用 作者:Aaron Maxwell,2016年5月5日 Python装饰器是很容易使用的.任何一个会写Pytho ...

  2. 由浅入深,走进Python装饰器-----第五篇:进阶--类装饰类

    上一篇:由浅入深,走进Python装饰器-----第四篇:进阶--函数装饰类 类装饰器 @类 类 4.1 用类装饰器来扩展原类( 增加属性和方法 ) # 用类装饰器来扩展原函数, 通过对象函数化触发_ ...

  3. python装饰器由浅入深_由浅入深,走进Python装饰器-----第五篇:进阶--类装饰类

    **类装饰器** @类 类 4.1 用类装饰器来扩展原函数( 增加属性和方法 ) # 用类装饰器来扩展原函数, 通过对象函数化触发__call__方法,进行返回 class KuoZhan(): de ...

  4. 面试系列 | 带你彻底搞懂 Python 装饰器

    本文作者:Rocky0249 公众号:Python空间 写在之前 「装饰器」作为 Python 高级语言特性中的重要部分,是修改函数的一种超级便捷的方式,适当使用能够有效提高代码的可读性和可维护性,非 ...

  5. python 装饰器实现_Python装饰器系列01 - 如何正确地实现装饰器

    虽然人们能利用函数闭包(function clouser)写出简单的装饰器,但其可用范围常受限制.多数实现装饰器的基本方式会破坏与内省(Introspection)的关联性. 可大多数人会说:who ...

  6. Python 装饰器详解(下)

    Python 装饰器详解(下) 转自:https://blog.csdn.net/qq_27825451/article/details/84627016,博主仅对其中 demo 实现中不适合pyth ...

  7. python装饰器教学_Python装饰器学习(九步入门)

    这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次 ...

  8. python装饰器函数-Python精进-装饰器与函数对象

    本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...

  9. python装饰器-python装饰器是哪个版本支持的

    python装饰器是哪个版本支持的 **kwargs): print ' % (unction.__name__:@app.route(':import unctoolsde log(text=&am ...

最新文章

  1. 80热敏打印机打印TxPrnMod.dll
  2. 在 Ubuntu 下安装 Discuz! 7.0
  3. Hibernate: Encountered a duplicated sql alias [] during auto-discovery of a native-sql
  4. python详细安装步骤-Python的详细安装步骤
  5. 诺基亚继续打情怀牌:怀旧小屏手机入网!
  6. linux免密码登录
  7. ASP.NETSpring.NETNHibernate最佳实践(七)——第3章人事子系统(4)人事子系统小结...
  8. Android Service用法知识点的讲解
  9. Windows Phone笔记(5)加速计和位置服务(转)
  10. mysql contain和like_mysql不带%的like 与等号之间的区别
  11. 兰州烧饼 NYOJ--779
  12. 无线路由器网络测试软件,如何简单快速测试家里无线路由器的网速和性能?
  13. ubuntu-Errors were encountered while processing
  14. 送书 | 教你爬取电影天堂数据
  15. python英文分词库_Python中文分词库jieba,pkusegwg性能准确度比较
  16. nyoj71 独木舟上的旅行
  17. 工地上的这些工种工资差距很大,你知道是哪些工种吗?
  18. MxNet系列——Windows上安装MxNet
  19. 为地球减碳1亿吨,阿里云低碳科技加速器发布
  20. 前端开发之---雅虎的34条军规

热门文章

  1. mysql的库与表的增删查改
  2. ASP.NET状态管理之一(概括篇)
  3. ReportViewer教程(2)-添加空报表Report1.rdlc
  4. 数电与模电的根本区别 转
  5. Pytorch《DCGAN模型》
  6. 有关迷宫的c语言程序的编写,3种C语言编写走迷宫的方法
  7. 数据结构——插入排序
  8. excel vba 特殊符号
  9. Apache PDFbox快速开发指南
  10. 牛客xiao白月赛32-- 拼三角(暴力却有坑)