代码之家  ›  专栏  ›  技术社区  ›  arnfred

python函数装饰器有什么我不能用第一类函数做的吗?

  •  1
  • arnfred  · 技术社区  · 10 年前

    我正在尝试理解Python函数装饰器,但到目前为止,我还没有看到任何一个函数装饰器可以做一些我用第一类函数做不到的事情。

    例如 logger decorator 通常作为一个有用的函数修饰符的简单示例给出:

    def logger(f):
        def new_f():
            print("Calling %s" % f.__name__)
            return f()
    return new_f
    

    然后,这个装饰器与我们想要记录的函数一起使用,如下所示:

    @logger
    def fun1():
        [do something]
    

    然而,对于相同的结果,我们可以只定义func1并用logger包装它:

    def fun2():
        [do something]
    def logged_fun2():
        return logger(fun2)()
    

    使命感 logged_fun2 类似于呼叫 fun1 。此外,当我们包装 fun2 具有 logger 我们仍然可以称之为原始 功能2 如果我们愿意的话,不记录。

    有什么事情我可以用装饰器做,但我不能用第一类函数做吗?还是将装饰器视为包装函数的语法糖更好?

    1 回复  |  直到 10 年前
        1
  •  1
  •   user2357112    10 年前

    Decorator语法:

    @deco
    def f(...):
        ...
    

    defined 完全等同于以下语法:

    def f(...):
        ...
    f = deco(f)
    

    所以,没有什么装饰器可以做到一流函数不能做到的。装饰者 一流的功能。