[ Python

装饰器有很多经典的使用场景,例如插入日志、性能测试、事务处理等等,有了装饰器,就可以提取大量函数中与本身功能无关的类似代码,从而达到代码重用的目的。

装饰器有两种写法:

  1. 装饰器不传参数

  2. 装饰器自带参数

第一种,装饰器不传参写法:

def log1(func):
    @wraps(func)
    def wrapper(*args, **kw):
        print('%s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

# 第一种不带参数的装饰器调用
@log1
def fn1():
    print('2017-06-16')
print(fn1())

# 执行结果如下:
# fn1():
# 2017-06-16
View Code

第二种,装饰器自带参数写法:

# 第二种,装饰器带参数写法:
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('hkey')
def fn2():
    print('2017-06-16')

print(fn2())

# 执行结果如下:
# hkey  fn2()
# 2017-06-16
View Code

将两种装饰器合并起来的函数:

# Author:hkey
def log(text):
    if hasattr(text, '__call__'):
        def wrapper(*arg, **kw):
            print('%s():' %text.__name__)
            return text(*arg, **kw)
        return wrapper
    else:
        def decorator(func):
            def wrapper(*args, **kw):
                print('%s():' %text)
                return func(*args, **kw)
            return wrapper
    return decorator

@log
def f():
    print('2017-6-17')

print(f())
View Code
原文地址:https://www.cnblogs.com/hukey/p/7028557.html