装饰器是一个函数,它接受另一个函数并扩展后一个函数的行为而不显式修改它。Python允许“嵌套”函数,即(另一个函数中的函数)。Python 还允许您从其他函数返回函数。
让我们说,您的原始函数称为 orig_func()。
def orig_func(): #definition
print("Wheee!")
orig_func() #calling
运行这个文件, orig_func() 被调用并打印。“呼”。
现在,让我们说,我们想修改这个函数,在调用这个函数之前做一些事情,在这个函数之后做一些事情。
所以,我们可以这样做,通过选项 1 或选项 2
- - - - 选项1 - - - - -
def orig_func():
print("Wheee!")
print "do something before"
orig_func()
print "do something after"
请注意,我们没有修改 orig_func。相反,我们在此函数之外进行了更改。但可能是,我们希望以这样一种方式进行更改,以便在调用 orig_func 时,我们能够在调用函数之前和之后做一些事情。所以,这就是我们所做的。
--------选项2----------
def orig_func():
print "do something before"
print("Whee!")
print "do something after"
orig_func()
我们已经达到了我们的目的。但代价是什么?我们不得不修改 orig_func 的代码。这可能并不总是可行的,特别是当其他人编写了该函数时。然而,我们希望当这个函数被调用时,它被修改成可以做之前和/或之后的事情。然后装饰器帮助我们做到这一点,无需修改 orig_func 的代码。我们创建了一个装饰器,并且可以保持与以前相同的名称。所以,如果我们的函数被调用,它会被透明地修改。我们通过以下步骤。一种。定义装饰器。在 docorator 中,1) 如果你愿意,可以在 orig_func 之前编写代码来做一些事情。2) 调用 orig_func 来完成它的工作。3) 如果你愿意,在 orig_func 之后编写代码来做某事。湾。创建装饰器 C. 叫装修师。
这是我们如何做到的。
==================================================== ===========
#-------- orig_func already given ----------
def orig_func():
print("Wheee!")
#------ write decorator ------------
def my_decorator(some_function):
def my_wrapper():
print "do something before" #do something before, if you want to
some_function()
print "do something after" #do something after, if you want to
return my_wrapper
#------ create decorator and call orig func --------
orig_func = my_decorator(orig_func) #create decorator, modify functioning
orig_func() #call modified orig_func
==================================================== ==============
注意,现在 orig_func 已经通过装饰器进行了修改。因此,现在当您调用 orig_func() 时,它将运行 my_wrapper,这将执行三个步骤,如前所述。
这样你就修改了 orig_func 的功能,而没有修改 orig_func 的代码,这就是装饰器的目的。