menu 我的书签 Python装饰器
文章开始
文章结尾

什么是装饰器?

装饰器是 Python 的一种重要语法结构,能够在不改变函数代码的前提下,增强其功能.可以把装饰器看作是一个返回函数的函数,即它接受一个函数作为参数,并返回一个新的函数.

装饰器的基本结构

装饰器一般由以下几个部分组成:

  1. 函数定义:一个需要被装饰的函数.
  2. 装饰器函数:一个接受函数作为输入并返回一个函数的函数.
  3. 包装函数:在装饰器内部定义一个函数,以扩展原功能.

以下是一个简单的装饰器示例:

def my_decorator(func):    def wrapper():        print("Something is happening before the function is called.")        func()        print("Something is happening after the function is called.")    return wrapper@my_decoratordef say_hello():    print("Hello!")# 调用装饰过的函数say_hello()

输出结果

执行上述代码的结果为:

Something is happening before the function is called.Hello!Something is happening after the function is called.

在这个例子中,say_hello 函数在调用时被 my_decorator 装饰,wrapper 函数在原始函数前后添加了额外的输出.

装饰器的工作原理

装饰器本质上是语法糖,背后的实际工作流程如下:

  1. 定义装饰器:首先,定义装饰器函数,它包含内部的包装函数.
  2. 应用装饰器:使用 @decorator_name 语法应用装饰器,这实际上是执行 say_hello = my_decorator(say_hello).
  3. 调用包装函数:当调用被装饰的函数时,实际调用的是包装函数,包装函数内部再调用原函数.

多个装饰器的使用

装饰器不仅可以单独使用,也可以组合使用.多个装饰器可以叠加在同一个函数上,顺序从内到外执行.

def uppercase_decorator(func):    def wrapper():        return func().upper()    return wrapperdef exclaim_decorator(func):    def wrapper():        return func() + "!"    return wrapper@exclaim_decorator@uppercase_decoratordef greet():    return "hello"# 调用被装饰的函数print(greet())

输出结果

执行上述代码,输出结果为:

HELLO!

在这个例子中,greet 函数首先被 uppercase_decorator 装饰,然后再被 exclaim_decorator 装饰.先将结果转为大写,最后加上感叹号.

装饰器参数化

如果我们希望装饰器能够接受参数,可以在外层再包裹一层函数,示例如下:

def repeat(num_times):    def decorator_repeat(func):        def wrapper(*args, **kwargs):            for _ in range(num_times):                func(*args, **kwargs)        return wrapper    return decorator_repeat@repeat(3)def say_hello():    print("Hello!")# 调用被装饰的函数say_hello()

输出结果

执行上述代码的结果为:

Hello!Hello!Hello!

这里,repeat 装饰器接受一个 num_times 参数,控制 say_hello 函数的调用次数.