普通装饰器示例
普通装饰器通常用于在不修改函数签名的情况下增强函数功能。
# 定义一个普通装饰器 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_decorator def say_hello():print("Hello!")# 调用被装饰的函数 say_hello()
在这个例子中,my_decorator
是一个装饰器,它接收一个函数 func
作为参数,并返回一个新的函数 wrapper
。wrapper
函数在原有函数执行前后添加了一些额外的操作。使用 @my_decorator
语法可以将这个装饰器应用于 say_hello
函数。
带参数的装饰器示例
带参数的装饰器稍微复杂一些,因为它需要在装饰器外部接收参数。
# 定义一个带参数的装饰器 def repeat(num_times):def decorator_repeat(func):def wrapper(*args, **kwargs):for _ in range(num_times):result = func(*args, **kwargs)return resultreturn wrapperreturn decorator_repeat# 使用带参数的装饰器 @repeat(num_times=3) def greet(name):print(f"Hello {name}!")# 调用被装饰的函数 greet("World")
在这个例子中,repeat
是一个带参数的装饰器工厂,它接收一个参数 num_times
。然后返回一个装饰器 decorator_repeat
,这个装饰器再返回一个包装函数 wrapper
。wrapper
函数根据 num_times
参数决定原函数 func
被调用的次数。
带参数的装饰器通常用于需要定制装饰器行为的场景。通过这种方式,你可以在不修改装饰器内部逻辑的情况下,通过参数传递来改变装饰器的行为。