zoukankan      html  css  js  c++  java
  • 关于Python的装饰器 decorator

    装饰器的原理:其实就是高阶函数,接收原函数以在之前之后进行操作。

    语法格式是固定的:先定义一个函数,再使用@语法调用该函数。

    例子一:

    import functools 
    
    
    # 定义装饰器,固定格式
    def log(func):
        @functools.wraps(func) # 将func的一些属性赋予wrapper,如__name__
        def wrapper(*args, **kw):
            print('before function %s' % func.__name__)
            func(*args, **kw)
            print('after function %s' % func.__name__)
    
        return wrapper
    
    
    @log # 使用装饰器,固定格式
    def run(words):
        print(words)
    
    
    # 执行被装饰的函数
    run('abc')

    上面是最简单的装饰器,就是在目标函数执行前后输出一些语句。个人认为,这与Java中的aop编程完全是一回事,如果你明白 [aop]+[注解] 编程,那很容易触类旁通。

    除了例子一这种简单的装饰器,有时候还需要让装饰器接收一些参数 -- 类似于Java的注解参数,这时候就要多一重嵌套了:

    # 如果decorator本身需要接收参数(非被装饰的函数)
    def log2(text):
        def decorator(func):
            def wrapper(*args, **kw):
                print('%s %s():' % (text, func.__name__))
                return func(*args, **kw)
            return wrapper
        return decorator
    
    @log2('execute')
    def now2():
        print('2017-02-03')
    
    now2()    
    
    print(now.__name__) # 没有使用@functool.wraps(func),所以~~

    ps:本文的案例模板来自廖学峰的Python3教程

  • 相关阅读:
    POJ1785 Binary Search Heap Construction
    Bzoj1185 [HNOI2007]最小矩形覆盖
    POJ2409 Let it Bead
    Bzoj2732 [HNOI2012]射箭
    Bzoj4515 [Sdoi2016]游戏
    Bzoj3925 [Zjoi2015]地震后的幻想乡
    Bzoj3223 Tyvj 1729 文艺平衡树
    COGS2642 / Bzoj4590 [Shoi2015]自动刷题机
    Bzoj1313 [HAOI2008]下落的圆盘
    python——描述符
  • 原文地址:https://www.cnblogs.com/larryzeal/p/6361624.html
Copyright © 2011-2022 走看看