装饰器的原理就是利用《闭包函数》来实现,闭包函数的原理就是包含内层函数的return和外层环境变量:

aaarticlea/png;base64,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" alt="" />

装饰器: 装饰器本质上是一个Python函数,其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值(return)也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。

1
2
3
4
5
6
7
8
9
先来看一个简单例子:
 
def foo():
    print('i am foo')
现在有一个新的需求,希望可以记录下函数的执行日志,于是在代码中添加日志代码:
 
def foo():
    print('i am foo')
    logging.info("foo is running")

bar()、bar2()也有类似的需求,怎么做?再写一个logging在bar函数里?这样就造成大量雷同的代码,为了减少重复写代码,我们可以这样做,重新定义一个函数:专门处理日志 ,日志处理完之后再执行真正的业务代码

1
2
3
4
5
6
7
8
def use_logging(func):
    logging.warn("%s is running" % func.__name__)
    func()
 
def bar():
    print('i am bar')
 
use_logging(bar)

逻 辑上不难理解, 但是这样的话,我们每次都要将一个函数作为参数传递给use_logging函数。而且这种方式已经破坏了原有的代码逻辑结构,之前执行业务逻辑时,执行 运行bar(),但是现在不得不改成use_logging(bar)。那么有没有更好的方式的呢?当然有,答案就是装饰器。

简单装饰器

 
aaarticlea/png;base64,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" alt="" />

函 数use_logging就是装饰器,它把执行真正业务方法的func包裹在函数里面,看起来像bar被use_logging装饰了。在这个例子中,函 数进入和退出时 ,被称为一个横切面(Aspect),这种编程方式被称为面向切面的编程(Aspect-Oriented Programming)。

@符号是装饰器的语法糖,在定义函数的时候使用,避免再一次赋值操作

aaarticlea/png;base64,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" alt="" />

如 上所示,这样我们就可以省去bar = use_logging(bar)这一句了,直接调用bar()即可得到想要的结果。如果我们有其他的类似函数,我们可以继续调用装饰器来修饰函数,而不 用重复修改函数或者增加新的封装。这样,我们就提高了程序的可重复利用性,并增加了程序的可读性。

装饰器在Python使用如此方便都要归因于Python的函数能像普通的对象一样能作为参数传递给其他函数,可以被赋值给其他变量,可以作为返回值,可以被定义在另外一个函数内。

带参数的装饰器

装饰器还有更大的灵活性,例如带参数的装饰器:在上面的装饰器调用中,比如 @use_logging,该装饰器唯一的参数就是执行业务的函数。装饰器的语法允许我们在调用时,提供其它参数,比如@decorator(a)。这 样,就为装饰器的编写和使用提供了更大的灵活性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def use_logging(level):
    def decorator(func):
        def wrapper(*args, **kwargs):
            if level == "warn":
                logging.warn("%s is running" % func.__name__)
            return func(*args)
        return wrapper
 
    return decorator
 
@use_logging(level="warn")
def foo(name='foo'):
    print("i am %s" % name)
 
foo()

上 面的use_logging是允许带参数的装饰器。它实际上是对原有装饰器的一个函数封装,并返回一个装饰器。我们可以将它理解为一个含有参数的闭包。当 我 们使用@use_logging(level="warn")调用的时候,Python能够发现这一层的封装,并把参数传递到装饰器的环境中。

类装饰器

再来看看类装饰器,相比函数装饰器,类装饰器具有灵活度大、高内聚、封装性等优点。使用类装饰器还可以依靠类内部的__call__方法,当使用 @ 形式将装饰器附加到函数上时,就会调用此方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Foo(object):
    def __init__(self, func):
      self._func = func
 
    def __call__(self):
      print ('class decorator runing')
      self._func()
      print ('class decorator ending')
 
@Foo
def bar():
    print ('bar')
 
bar()
functools.wraps

使用装饰器极大地复用了代码,但是他有一个缺点就是原函数的元信息不见了,比如函数的docstring、__name__、参数列表,先看例子:

装饰器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def logged(func):
    def with_logging(*args, **kwargs):
        print func.__name__ + " was called"
        return func(*args, **kwargs)
    return with_logging
函数
 
@logged
def f(x):
   """does some math"""
   return + * x
该函数完成等价于:
 
 
def f(x):
    """does some math"""
    return + * x
= logged(f)
不难发现,函数f被with_logging取代了,当然它的docstring,__name__就是变成了with_logging函数的信息了。
 
print f.__name__    # prints 'with_logging'
print f.__doc__     # prints None

  

这个问题就比较严重的,好在我们有functools.wraps,wraps本身也是一个装饰器,它能把原函数的元信息拷贝到装饰器函数中,这使得装饰器函数也有和原函数一样的元信息了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from functools import wraps
def logged(func):
    @wraps(func)
    def with_logging(*args, **kwargs):
        print func.__name__ + " was called"
        return func(*args, **kwargs)
    return with_logging
 
@logged
def f(x):
    """does some math"""
    return + * x
 
print f.__name__  # prints 'f'
print f.__doc__   # prints 'does some math'

  

内置装饰器

@staticmathod、@classmethod、@property

装饰器的顺序

@a
@b
@c
def f ():

等效于
  f = a(b(c(f)))

aaarticlea/png;base64,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" alt="" />

最新文章

  1. 自动化-Appium
  2. 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能
  3. 【Android车载系统 News | Tech 1】News 谷歌开发车载Android系统 2014-12-19
  4. esriFeatureType与esriGeometryType的区别与联系
  5. 【应聘】阿里巴巴Java面试题目
  6. reset.css(详细说明)
  7. 前端js框架收藏
  8. 登录MD5加盐处理
  9. 偶然碰到的Win7 64位下CHM 的问题解决
  10. BAD packet signature 18245 错误解决
  11. UVA 1364 - Knights of the Round Table (获得双连接组件 + 二部图推理染色)
  12. struts2自定义日期类型转换器
  13. ASP.NET MVC Filter的思考
  14. 201521123080《Java程序设计》第2周学习总结
  15. 原生addClass 方法 添加类函数
  16. 打开和创建SqlCe(.sdf文件)
  17. sql统计总和和各状态数
  18. vue动态设置初始页
  19. Linux中FTP远程传输,SSH远程连接,以及SCP远程拷贝
  20. docker容器跑redis

热门文章

  1. matlab中setdiff
  2. nginx 配置文件 2019-12-20
  3. Navicat Premium12远程连接MySQL数据库
  4. linux 查看系统性能
  5. Zjoi2010排列计数Perm
  6. springboot拦截异常信息发送邮件提醒
  7. redis数据类型为key的常用命令
  8. [Java]算术表达式组建二叉树,再由二叉树得到算式的后序和中序表达式
  9. Mac 下 Android Studio 连 夜神模拟器 调试
  10. 2.oracle数据库:[1]oracle简易客户端安装方法