1

我正在尝试理解 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)()

Callinglogged_fun2类似于 call fun1。此外,当我们使用 wrap 时fun2,如果我们愿意,logger我们仍然可以在不记录的情况下调用原始文件。fun2

有没有我可以用装饰器做的事情我不能用一流的功能做?还是将装饰器视为包装函数的语法糖形式更好?

4

1 回答 1

1

装饰器语法:

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

定义为完全等同于以下语法:

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

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

于 2014-08-19T03:00:13.703 回答