def deco(x,y):
print "********"
return "sum",x+y
def add(x,y):
value = deco(x,y)
print value
add(5,6)
add(5,5)
def deco(add):
def wrap(args,kwargs):
print "*********"
print args,kwargs
sum = add(args,kwargs)
return sum
return wrap
@deco
def add(x,y):
print "sum",x+y
add(5,6)
add(5,5)
请有人能解释我的不同之处。什么时候实际装饰器是有用的
此致 〜
答案 0 :(得分:0)
1 装饰器何时真正有用?
装饰器功能的目的是动态地改变函数的执行行为。在你的第二个例子中,这就是你的装饰器函数所做的事情 - 它改变了调用它时add
的行为(装饰器是否有用是一个不同的故事)。
装饰器有用的原因是它们允许您快速轻松地更改函数的行为,而无需直接修改函数。
例如,假设我们有两个功能。一个计算数字的阶乘,一个产生斐波纳契数列:
def factorial(n):
total = 1
while n > 1:
total *= n
n -= 1
return total
def fibonacci_sequence(n):
a, b = 0, 1
while b < n:
yield b
a, b = b, a+b
我们希望修改两个函数以打印执行时间。我们可以更改这两个函数来单独计算执行时间,但这会很冗长并违反DRY的规则。
相反,Python允许我们使用装饰器轻松更改函数的行为。在我们的例子中,我们可以创建一个简单的时序装饰器:
import time
def timeit(func):
def wrapper(*args, **kwargs):
start_time = time.time()
value = func(*args, **kwargs)
execution_time = time.time()
print("Function {} took {}s to execute.".format(
func.__name__, execution_time - start_time
))
return value
return wrapper
现在,我们可以简单地在每个所需函数上使用装饰器语法,而不必将时序逻辑复制到我们想要的每个函数:
@timeit
def factorial(n):
# body
@timeit
def fibonacci_sequence(n):
# body
简而言之,当您具有要应用于一个或多个函数的行为时,装饰器非常有用,而无需直接修改函数。它允许更清晰,更紧凑的代码。
1 请注意,我将您的问题的语法更改为更具可读性。