Python装饰器详解:从基础到实践
需积分: 0 181 浏览量
更新于2024-09-01
收藏 98KB PDF 举报
"Python学习笔记之装饰器"
在Python编程中,装饰器是一种强大的工具,能够扩展或修改函数、方法或类的行为,而不直接修改它们的源代码。装饰器本质上是接收一个函数作为参数并返回一个新的函数的高阶函数。它们在保持代码整洁和模块化方面发挥着关键作用。
一、装饰器的概念
装饰器允许我们在不改动原有函数代码的情况下,增加新的功能或对原有功能进行修饰。这与面向切面编程(AOP)的理念相似,可以在运行时动态地插入代码。装饰器在Python中的应用广泛,例如记录日志、性能分析、事务处理、权限控制等。
二、装饰器的工作原理
装饰器接收一个函数作为输入,并返回一个新的函数。当我们调用被装饰的函数时,实际上是在调用装饰器返回的新函数。这个新函数会在执行原函数之前或之后添加额外的操作。
例如,下面的`add`函数是功能函数,`logger`则是装饰器。装饰器通过`fn`参数接收`add`函数,并在调用`add`前打印"first",调用后打印"second"。
```python
def add(x, y):
return x + y
def logger(fn):
def wrapper(*args, **kwargs):
print('first')
result = fn(*args, **kwargs)
print('second')
return result
return wrapper
# 装饰add函数
decorated_add = logger(add)
print(decorated_add(4, 5)) # 输出: first, second, 9
```
三、装饰器的参数处理
在上面的例子中,`logger`装饰器没有处理`add`函数的参数。为了使装饰器更具通用性,可以将参数传递给装饰器。在示例2中,我们通过`*args`和`**kwargs`来处理任意数量的位置参数和关键字参数。
```python
def logger(fn):
def wrapper(*args, **kwargs):
print('first')
result = fn(*args, **kwargs)
print('second')
return result
return wrapper
decorated_add = logger(add)
print(decorated_add(1, y=11)) # 输出: first, second, 12
```
四、装饰器的柯里化
柯里化是将接受多个参数的函数转化为接受一个单一参数(通常是另一个函数),并返回一个新函数的技术。在Python装饰器中,我们可以通过嵌套函数实现柯里化。以下是一个简单的柯里化的装饰器例子:
```python
def add(x, y):
return x + y
def logger(fn):
def wrapper(*args, **kwargs):
print('begin')
result = fn(*args, **kwargs)
print('end')
return result
return wrapper
decorated_add = logger(add)
print(decorated_add(1, 11)) # 输出: begin, end, 12
```
在这个例子中,`logger`装饰器创建了一个内部函数`wrapper`,它接受参数并调用原函数,然后在调用前后添加特定行为。
总结来说,Python装饰器是一种强大且灵活的编程技术,可以用来增强函数功能,保持代码结构清晰,同时也支持代码的复用。通过理解装饰器的工作原理和应用场景,开发者能够更好地组织和优化代码,提高代码的可维护性和可读性。
672 浏览量
2009-03-14 上传
273 浏览量
768 浏览量
2010-01-22 上传
2013-08-03 上传
2008-06-30 上传
456 浏览量
weixin_38570854
- 粉丝: 5
- 资源: 931
最新资源
- jspm-sample.tk:示例 jspm 应用程序 - 使用 angular 开发到生产流程
- 解析玩具:解析玩具
- 理财管理信息系统.rar
- Tampermonkey-Scripts
- 外语培训机构信息网页模板
- spideForm:动态HTML 5画布,用于创建显示表单的图形
- e-indicacao-fe
- StereoCorrespondenceGC:使用图切割技术实现立体对应
- parameterized-reporting-presentation
- TrackerUI
- ReactTemplate.zip
- 小度wifi、360wifi、MiWifi、wifibao_MacOS-15可用.zip
- replaceall:替换 JavaScript 字符串中的所有实例
- 扇贝学习工具-crx插件
- Base32-Module:用于与Base10相互转换的Base32Module
- hss-urlmeme:轻松将图像发布到HSS聊天室