文章开始
文章结尾
装饰器是 Python 的一种重要语法结构,能够在不改变函数代码的前提下,增强其功能.可以把装饰器看作是一个返回函数的函数,即它接受一个函数作为参数,并返回一个新的函数.
装饰器一般由以下几个部分组成:
以下是一个简单的装饰器示例:
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
函数在原始函数前后添加了额外的输出.
装饰器本质上是语法糖,背后的实际工作流程如下:
装饰器不仅可以单独使用,也可以组合使用.多个装饰器可以叠加在同一个函数上,顺序从内到外执行.
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
函数的调用次数.