Python中装饰器的原理和应用实例
装饰器(Decorator)是Python中一种强大的语言特性,它允许我们在不改变原函数代码的情况下,为其添加新的功能。
原理:
- 装饰器本质上是一个返回新函数的函数。
- 当我们将这个装饰器作为参数应用到一个函数上时,实际上是将原来的目标函数替换为一个新的函数。
应用实例:
- 计时器装饰器:
```python
import time
def timerdecorator(func):
def wrapper(args, **kwargs):
start_time = time.time()
result = func(args, **kwargs))
endtime = time.time()
print(f”{func.__name}} took {end_time - start_time} seconds”)
return result
return wrapper
@timer_decorator
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10)))
这段代码会为`fibonacci`函数添加一个计时器,计算并打印出执行`fibonacci(10)`所需的时间。
2. 日志记录装饰器:
```python
import logging
def log_decorator(func):
def wrapper(*args, **kwargs):
logger = logging.getLogger(func.__module__))
logger.setLevel(logging.INFO)
try:
result = func(*args, **kwargs))
logger.info(f"Executed {func.__name__}} successfully with result: {result}")
return result
except Exception as e:
logger.error(f"Error occurred during execution of {func.__name__}}: {str(e)}"))
raise e
return wrapper
@log_decorator
def divide_numbers(a, b):
if b == 0:
raise ValueError("Cannot divide by zero.")
return a / b
try:
result = divide_numbers(10, 2))
print(f"Result: {result}")
except Exception as e:
print(f"Error occurred: {str(e)})")
这段代码会为divide_numbers
函数添加一个日志记录装饰器,当执行divide_numbers(10, 2)()
时,会将执行过程中的信息(包括成功与失败的案例)以文本形式输出。
还没有评论,来说两句吧...