在python中,函数调用和装饰器之间有什么区别

时间:2017-02-22 14:18:00

标签: python

正常功能:

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)

请有人能解释我的不同之处。什么时候实际装饰器是有用的

此致 〜

1 个答案:

答案 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 请注意,我将您的问题的语法更改为更具可读性。