我正在尝试理解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
时,如果我们愿意,我们仍然可以调用原始fun2
而无需记录。
我能用装饰器做些什么我不能用一流的功能吗?或者将装饰器看作包裹函数的语法糖形式更好?
答案 0 :(得分:1)
装饰器语法:
@deco
def f(...):
...
与defined完全等同于以下语法:
def f(...):
...
f = deco(f)
所以不,没有任何装饰者可以做的,一流的功能是不可能的。装饰器是一流的功能。