Python中的函数装饰器?

Python开发人员可以扩展和修改可调用函数,方法或类的行为,而无需通过使用修饰符来永久修改可调用函数本身。简而言之,我们可以说它们是可调用的对象,用于修改函数或类。

函数装饰器是接受函数引用作为参数的函数,并在其周围添加包装器,然后将带有包装器的函数作为新函数返回。

让我们通过一个例子来了解函数装饰器:

代码1

@decorator
def func(arg):
   return "value"

上面的代码与:

代码2

def func(arg):
   return "value"
func = decorator(func)

因此,从上面我们可以看到装饰器只是另一个函数,该函数将一个函数作为参数并返回一个。

装饰器基本上可以“修饰”或“包装”另一个函数,并允许您在包装的函数运行之前和之后执行代码,如下例所示:

def our_decorator(func):
   def function_wrapper(x):
      print("Before calling " + func.__name__)
      func(x)
      print("After calling " + func.__name__)
   return function_wrapper

def foo(x):
   print("Hi, foo has been called with " + str(x))

print("我们在装饰之前先叫foo:")
foo("Hi")

print("我们现在用f装饰foo:")
foo = our_decorator(foo)

print("装饰后我们将foo称为:")
foo(90)

输出结果

我们在装饰之前先叫foo:
Hi, foo has been called with Hi
我们现在用f装饰foo:
装饰后我们将foo称为:
Before calling foo
Hi, foo has been called with 90
After calling foo

如果您认为上述内容有点复杂,那么请编写最简单的装饰器:

def null_decorator(func):
   return func

在null_decorator上方是一个callable(function),它将另一个callable作为其输入,并返回相同的可调用输入,而无需对其进行修改。

让我们通过装饰(或包装)另一个函数来扩展上述最简单的装饰器。

def null_decorator(func):
   return func
def greet():
   return "Hello, Python!"

greet = null_decorator(greet)
>>> greet()'Hello, Python!'

上面我们定义了一个greet函数,然后通过通过null_decorator函数运行它来立即装饰它。

编写上述python装饰程序的更简单方法(而不是在greet上显式调用null_decorator然后重新分配greet变量)是使用python @syntax一步装饰一个函数:

@null_decorator
def greet():
   return "Hello, Python!"
>>> greet()'Hello, Python!'