Python开发人员可以扩展和修改可调用函数,方法或类的行为,而无需通过使用修饰符来永久修改可调用函数本身。简而言之,我们可以说它们是可调用的对象,用于修改函数或类。
函数装饰器是接受函数引用作为参数的函数,并在其周围添加包装器,然后将带有包装器的函数作为新函数返回。
让我们通过一个例子来了解函数装饰器:
@decorator def func(arg): return "value"
上面的代码与:
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!'