Discuss / Python / 关于装饰器参数具体哪一个才是被装饰的 函数,现在的理解

关于装饰器参数具体哪一个才是被装饰的 函数,现在的理解

Topic source

湫风

#1 Created at ... [Delete] [Delete and Lock User]

刚开始看装饰器还有点糊涂,主要是在参数这块,刚刚试了试,我现在对于装饰器参数的理解是这样的:

import time

def deco_para(parameter):
    print(parameter)
    def deco_func(inputText):
        print(inputText)

        def wrapper2(func):
            def wrapper(*args, **kwargs):
                print('enter wrapper')
                print(parameter)
                print('---wrapper: before func---')
                func(*args, **kwargs)
                print('---wrapper: after func---')
            return wrapper
        return wrapper2
    return deco_func("hello world")


@deco_para(123)
def foo():
    print("current time is ", time.time())


if __name__ == '__main__':
    foo()

首先装饰器函数,以我的用例来讲,就是 `deco_para`,

如果是没有指定参数的形式 (@deco_para) 作为装饰器,那么它有且仅有一个参数,这个参数就是它装饰的那个函数(foo);

如果是以给出参数的形式 (@deco_para(123)) 作为装饰器,那么被装饰函数 (foo) 在装饰器函数定义里面实际是作为返回的第一个不带参数的函数的参数,

以上面的例子来说,

装饰器 @deco_para(123) 是以带参数的形式调用的,所以 foo 不作为 deco_para 的实际参数,

继续往下找,deco_para 返回值为 deco_func("hello world"),这是一个带了参数的函数调用,foo 也不作为 deco_func 的实参,

继续,deco_func 返回值为 wrapper2,这是一个不带参数的函数的直接引用,那么 foo 实际是作为 wrapper2 的实参,这个  def wrapper2(func): 里的 func 才能调用 func.__name__ 得到 "foo" 的名字  

实际上就是 foo() = deco_para(123)("hello world")(foo)

刚刚这里有点迷糊,现在对这里的理解是这样的

diasarah

#2 Created at ... [Delete] [Delete and Lock User]

感谢!看了理解了一点

apprentice

#3 Created at ... [Delete] [Delete and Lock User]

确实对新手理解有很大帮助啊!!!!建议兄弟们可以去b站看一些关于装饰器的解释,对理解有很大帮助

倒数第二句话最明了


  • 1

Reply