美文网首页
python的装饰器为什么需要函数里面定义函数?

python的装饰器为什么需要函数里面定义函数?

作者: 飘渺的心意 | 来源:发表于2018-12-11 22:31 被阅读17次

对装饰器接触过的同学都知道,一般写装饰器的时候会定义一个内部的wrapper函数

def decorate(func):  # 传入函数名当然是因为python处处皆是对象
    def wrapper(a, b):
        print('*'*30)
        return func(a, b)
    return wrapper

@decorate
def add(a, b):
    return a + b

if __name__ == '__main__':
    print(add(1, 2))

输出

******************************
3

如果这么写,不去调用add函数

def decorate(func):
    print('run')
    def wrapper(a, b):
        print('*'*30)
        return func(a, b)
    return wrapper

@decorate
def add(a, b):
    return a + b

# if __name__ == '__main__':
#     print(add(1, 2))

输出

run

所以这里必须定义内部函数,这属于python的闭包

而且为什么是return wrapper而不是return wrapper()?

return wrapper可以理解为返回wrapper函数的指针

返回给add方法,在调用add方法的时候相当于执行了wrapper方法,所以wrapper也需要和add方法传入同样的参数

如果不传参:

def decorate(func):
    def wrapper():
        print('*'*30)
        return func()
    return wrapper

@decorate
def add(a, b):
    return a + b

if __name__ == '__main__':
    print(add(1, 2))

它报的错是wrapper函数需要参数

TypeError: wrapper() takes 0 positional arguments but 2 were given

而且不调用add方法的时候wrapper也不会被执行(因为返回的仅仅是指针)

如果

print(add.__name__)

输出

wrapper

当然如果想参数传递更通用,可以

def decorate(func):
    def wrapper(*args, **kwargs):
        print('*'*30)
        return func(*args, **kwargs)
    return wrapper

相关文章

  • python的装饰器为什么需要函数里面定义函数?

    对装饰器接触过的同学都知道,一般写装饰器的时候会定义一个内部的wrapper函数 输出 如果这么写,不去调用add...

  • python装饰器

    装饰器简述 要理解装饰器需要知道Python高阶函数和python闭包,Python高阶函数可以接受函数作为参数,...

  • 装饰器

    [TOC] 函数 函数定义 函数调用 高阶函数 嵌套函数 装饰器 装饰器=高阶函数+嵌套函数 基础装饰器 假设有一...

  • Python - 学习理解带参数的装饰器

    理解带参数的装饰器 参考文章 Python精进-装饰器与函数对象 加了装饰器这段代码从一个函数定义(不会执行任何东...

  • Python第四天(函数高级)

    python闭包: 装饰器:所谓的装饰器,就是不改变原来的函数,再对原函数进行其他的输出操作定义一个原函数的装饰函...

  • python之理解闭包和装饰器

    python之理解闭包和装饰器 1、闭包函数 1.1 python中函数都是对象 结果: 上面定义一个shut函数...

  • python07_函数装饰器

    函数装饰器 为什么要用装饰器?装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前...

  • 多个装饰器存在时的执行顺序

    装饰器的执行顺序是怎样的? 装饰器函数的执行顺序分为定义阶段和执行阶段,装饰器函数在被装饰函数定义好后立即执行 在...

  • 理解 Python 装饰器与回调函数

    1.理解 Python 装饰器2.Python装饰器和回调函数回调函数就是一个通过函数指针调用的函数。如果你把函数...

  • 装饰器函数

    在Python有一类特殊的函数,叫装饰器函数。装饰器函数可以在函数的调用的时候,将装饰器的内容注入到函数之中。在定...

网友评论

      本文标题:python的装饰器为什么需要函数里面定义函数?

      本文链接:https://www.haomeiwen.com/subject/yqryhqtx.html