码迷,mamicode.com
首页 > 编程语言 > 详细

python装饰器

时间:2019-11-22 14:08:45      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:tar   test   __name__   for   结果   函数调用   int   --   mat   

什么是装饰器,简单点来说,就是在不改变函数本身的前提下给一个函数添加新的功能。

def deco(fn):
    def wrapper(x):
        print(装饰器start-----------)
        fn(x)
        print("fn.__name__============",fn.__name__)
        print(装饰器start-----------)
    return wrapper

def log(params):
    print("params is..........",params)

deco(log)(我是被装饰函数)

如果把log函数作为参数传给deco函数,运行结果如下

装饰器start-----------
params is.......... 我是被装饰函数
fn.__name__============ log
装饰器start-----------

如果利用函数装饰器,在def log上加上@deco,然后直接调用log函数,结果也是一样的

def deco(fn):
    def wrapper(x):
        print(装饰器start-----------)
        fn(x)
        print("fn.__name__============",fn.__name__)
        print(装饰器start-----------)
    return wrapper
@deco
def log(params):
    print("params is..........",params)

log(我是被装饰函数)

result:

装饰器start-----------
params is.......... 我是被装饰函数
fn.__name__============ log
装饰器start-----------

看吧,一样的结果,只不过这次直接调用log函数,就可以实现新的功能,且没有改变他原有的代码!

 

带参数的装饰器

装饰器允许传入参数,一个携带了参数的装饰器将有三层函数,如下所示:

def log_with_param(text):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print(call %s(): % func.__name__)
            print(args = {}.format(*args))
            print(log_param = {}.format(text))
            return func(*args, **kwargs)
        return wrapper
    return decorator

@log_with_param("param")
def test_with_param(p):
    print(test_with_param.__name__)

test_with_param("被装饰函数")

看到这个代码是不是又有些疑问,内层的decorator函数的参数func是怎么传进去的?和上面一般的装饰器不大一样啊。

其实道理是一样的,将其@语法去除,恢复函数调用的形式一看就明白了:

# 传入装饰器的参数,并接收返回的decorator函数
decorator = log_with_param("param")
# 传入test_with_param函数
wrapper = decorator(test_with_param)
# 调用装饰器函数
wrapper("I‘m a param")

输出结果与正常使用装饰器相同:

call test_with_param():
args = 被装饰函数
log_param = param
wrapper

至此,装饰器这个有点费解的特性也没什么神秘了。

python装饰器

标签:tar   test   __name__   for   结果   函数调用   int   --   mat   

原文地址:https://www.cnblogs.com/pfeiliu/p/11910830.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!