为什么我们在装饰器中使用包装器,何时我们可以创建没有包装器的装饰器?

时间:2017-09-11 00:41:40

标签: python python-2.7 python-3.x closures decorator

我正在阅读python装饰器并发现它们非常有用,但我有一个混乱,我试图在谷歌和stackoverflow上搜索但是找不到好的答案,一个问题已经在stackoverflow上被问到相同的标题,但那个问题谈话关于@wrap和我的问题是不同的:

那么基本的装饰模板是什么:

def deco(x):
    def wrapper(xx):
        print("before the deco")
        x(xx)
        print("after the deco")
    return wrapper


def new_func(a):
    print("this is new function")

wow=deco(new_func)
print(wow(12))

结果如何:

before the deco
this is new function
after the deco
None

所以每当deco返回它调用包装函数时,现在我没有得到的是为什么我们使用包装器当我们的主要目标是将new_func作为参数传递给deco函数然后在deco函数中调用该参数,如果我尝试那么我可以在没有包装函数的情况下创建相同的东西:

def deco(x):
    print("before the deco")
    a=1
    x(a)
    print("after the deco")




def new_func(r):
    print("this is new function")


wow=deco(new_func)
print(wow)

结果:

before the deco
this is new function
after the deco
None

那么装饰器中包装器的用途是什么?

1 个答案:

答案 0 :(得分:0)

这是一个可能有帮助的问题。让我们改变new_func吧 实际上使用它传递的参数。 e.g。

def new_func(r):
    print("new_func r:", r)

假设我们还有another_func将参数传递给new_func

def another_func():
    new_func(999)

问题是,你怎么能写deco以便

  • another_func继续工作,没有任何变化,
  • new_func收到从another_func
  • 传递给它的任何值