## 深入理解Python装饰器:原理与应用
Python装饰器(decorators)是一种非常强大且灵活的工具,允许你在不修改函数或方法本身的情况下,增强或修改它们的行为。装饰器本质上是一个返回函数的高阶函数。本文将详细介绍装饰器的原理,并通过示例代码展示它们的实际应用。
### 装饰器的基本概念
装饰器是一个函数,它接受另一个函数作为参数,并返回一个新的函数。这个新的函数通常会扩展或修改原始函数的行为。下面是一个简单的装饰器示例:
```python
def simple_decorator(func):
def wrapper():
print("Something is happening before the function is called.")
func()
print("Something is happening after the function is called zwo637 com")
return wrapper
@simple_decorator
def say_hello():
print("Hello!")
say_hello()
```
输出:
```
Something is happening before the function is called.
Hello!
Something is happening after the function is called.
```
在这个示例中,`simple_decorator` 是一个装饰器,它在 `say_hello` 函数调用前后添加了一些额外的行为。
### 带参数的装饰器
装饰器不仅可以用于无参数的函数,还可以处理带参数的函数。为了实现这一点,我们需要在 `wrapper` 函数中接收任意数量的参数和关键字参数:
```python
def decorator_with_args(func):
def wrapper(*args, **kwargs):
print(f"Arguments were: {args}, {kwargs}")
return func(*args, **kwargs)
return wrapper
@decorator_with_args
def greet(name, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice", greeting="Hi")
```
输出:
```
Arguments were: ('Alice',), {'greeting': 'Hi'}
Hi, Alice!
```
### 嵌套装饰器
有时,你可能需要将多个装饰器应用于同一个函数。这被称为嵌套装饰器,应用顺序是从内到外。让我们来看一个示例:
```python
def uppercase_decorator(func):
def wrapper(*args, **kwargs):
original_result = func(*args, **kwargs)
modified_result = original_result.upper()
return modified_result
return wrapper
def exclaim_decorator(func):
def wrapper(*args, **kwargs):
original_result = func(*args, **kwargs)
modified_result = original_result + "!"
return modified_result
return wrapper
@uppercase_decorator
@exclaim_decorator
def greet(name):
return f"Hello, {name}"
print(greet("Alice"))
```
输出:
```
HELLO, ALICE!
```
在这个示例中,`greet` 函数首先被 `exclaim_decorator` 装饰,然后再被 `uppercase_decorator` 装饰。
### 实际应用:记录函数执行时间
装饰器的一个实际应用是记录函数的执行时间。下面是一个示例,展示如何使用装饰器来实现这一功能:
```python
import time
def timing_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Function {func.__name__} took {end_time - start_time:.4f} seconds to execute.")
return result
return wrapper
@timing_decorator
def slow_function():
time.sleep(2)
print("Function finished.")
slow_function()
```
输出:
```
Function finished.
Function slow_function took 2.0001 seconds to execute.
```
### 总结
装饰器是Python中非常有用的工具,能够让你在不修改原始函数的情况下,增强或修改其行为。通过本文的示例代码,你应该能理解装饰器的基本原理和一些实际应用。无论是用于日志记录、性能监控还是权限检查,装饰器都能大显身手。希望这篇文章能帮助你更好地掌握Python装饰器,并在你的项目中灵活运用它们。
---
分享
热搜
相关推荐
-
任期剩2个多月 拜登政府"突击拱火"采取新的越线行动
上游新闻 1.4万跟贴 -
不靠更复杂的策略,仅凭和大模型训练对齐,零样本零经验单LLM调用
机器之心Pro 1跟贴 -
知情人士:卡塔尔退出加沙和谈
财联社 2.2万跟贴 -
半小时教你手搓AI视频通话,还有懒人版代码已开源
量子位 3跟贴 -
大神Karpathy:我给大模型「SQL注入」攻击,简直不要太轻松
机器之心Pro -
库尔斯克大战一触即发,北约秘书长吕特作出最霸气表态!
史政先锋 4036跟贴 -
阿里推出AI数据科学家,全流程自动化,科研小白也能用
量子位 21跟贴 -
多模态模型免微调接入互联网,即插即用新框架,效果超闭源方案
量子位 4跟贴 -
12连胜!骑士险胜公牛联盟第一 米切尔36+8
醉卧浮生 2568跟贴 -
我买的新房子贬值了 7.5 万英镑,现在我担心它会不会塌
英国那些事儿 -
武磊已返回国内+接受全面治疗 确认缺战巴林
风过乡 5516跟贴 -
2025年节假日安排公布:春节放假调休共8天
中国政府网 2075跟贴 -
问界M9辅道急速行驶 未能识别障碍与公交车迎头相撞
征垣之路 5606跟贴 -
定了,中山孙文西路房屋征收,每平米购房补助4500元
南方都市报 661跟贴 -
中俄举行战略安全磋商 达成新共识
外交部 1.3万跟贴 -
几行乱码让大模型获得科学思维,这个神奇的提示词突然火了
机器之心Pro 49跟贴 -
美国被指要台积电停供大陆7纳米AI芯片
环球网资讯 7237跟贴 -
外宾看到直-9F瞬间走不动道了 海军讲解员立马上前为其讲解
每日趣事儿 4200跟贴 -
在阿里,痛苦的人开始信教
钛媒体APP 2609跟贴 -
这才是加沙人的真是声音 !国内黄哈怎么看?
ConfusionMax 7192跟贴
热门跟贴