python装饰器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python装饰器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3513字,纯文字阅读大概需要6分钟。
内容图文
![python装饰器](/upload/InfoBanner/zyjiaocheng/613/fb9665b2815e4d2db9a0a945c2d9aa60.jpg)
1. 装饰器的定义
就是给已有函数增加额外功能的函数,它本质上就是一个闭包函数。
装饰器的功能特点:
- 不修改已有函数的源代码
- 不修改已有函数的调用方式
- 给已有函数增加额外的功能
2.装饰器代码
# 添加一个登录验证的功能 def decorator(fn): def inner(): print("请先登录....") fn() return inner def comment(): print("发表评论") # 使用装饰器来装饰函数 comment = decorator(comment) comment()
执行结果:
请先登录.... 发表评论
3. 装饰器的语法糖写法
Python给提供了一个装饰函数更加简单的写法,那就是语法糖,语法糖的书写格式是: @装饰器名字,通过语法糖的方式也可以完成对已有函数的装饰
# 添加一个登录验证的功能 def decorator(fn): def inner(): print("请先登录....") fn() return inner @decorator def comment(): print("发表评论") # 使用装饰器来装饰函数 comment()
说明:
- @decorator 等价于 comment = check(comment)
- 装饰器的执行时间是加载模块时立即执行。
4. 通用装饰器
# 通用装饰器 def decorator(fn): def inner(*args, **kwargs): print("请先登录....") res = fn(*args, **kwargs) return res return inner @decorator def comment(): print("发表评论") @decorator def calculate(a, b): return a + b # 使用装饰器来装饰函数 comment() print(calculate(1,2))
执行结果:
请先登录.... 发表评论 请先登录.... 3 Process finished with exit code 0
说明:
- 同用装饰器就是内部函数使用可变参数且有返回值的装饰器,因为可变参数可以接收任何参数
-
res = fn(*args, **kwargs) 内部函数这里的*args, **kwargs,是将元组args解包为位置参数,将字典kwargs解包为关键字参数
5. 多个装饰器的使用:
def make_div(func): """对被装饰的函数的返回值 div标签""" def inner(*args, **kwargs): return "<div>" + func(*args, **kwargs) + "</div>" return inner def make_p(func): """对被装饰的函数的返回值 p标签""" def inner(*args, **kwargs): return "<p>" + func(*args, **kwargs) + "</p>" return inner # 装饰过程: 1 content = make_p(content) 2 content = make_div(content) # content = make_div(make_p(content)) @make_div @make_p def content(): return "人生苦短" result = content() print(result)
执行结果:
<div><p>人生苦短</p></div> Process finished with exit code 0
说明:
- 多个装饰器装饰过程为由内到外装饰,上面的例子先make_p装饰,然后用make_div装饰
6. 带参数的装饰器
# 添加输出日志的功能 def logging(flag): def decorator(fn): def inner(num1, num2): if flag == "+": print("--正在努力加法计算--") elif flag == "-": print("--正在努力减法计算--") result = fn(num1, num2) return result return inner # 返回装饰器 return decorator # 使用装饰器装饰函数 @logging("+") def add(a, b): result = a + b return result @logging("-") def sub(a, b): result = a - b return result result = add(1, 2) print(result) result = sub(1, 2) print(result)
说明:
- 使用带有参数的装饰器,其实是在装饰器外面又包裹了一个函数,使用该函数接收参数,返回是装饰器,因为 @ 符号需要配合装饰器实例使用
7. 类装饰器
装饰器还有一种特殊的用法就是类装饰器,就是通过定义一个类来装饰函数。
类装饰器示例代码:
class Check(object): def __init__(self, fn): # 初始化操作在此完成 self.__fn = fn # 实现__call__方法,表示对象是一个可调用对象,可以像调用函数一样进行调用。 def __call__(self, *args, **kwargs): # 添加装饰功能 print("请先登陆...") self.__fn() @Check def comment(): print("发表评论") comment()
说明:
- @Check 等价于 comment = Check(comment), 所以需要提供一个init方法,并多增加一个fn参数。
- 装饰器执行完comment变量就变成一个Check的一个实例对象
- 要想类的实例对象能够像函数一样调用,需要在类里面使用call方法,把类的实例变成可调用对象(callable),也就是说可以像调用函数一样进行调用。
- 在call方法里进行对fn函数的装饰,可以添加额外的功能。
执行结果:
请先登陆... 发表评论
2. 小结
- 想要让类的实例对象能够像函数一样进行调用,需要在类里面使用call方法,把类的实例变成可调用对象(callable)
- 类装饰器装饰函数功能在call方法里面进行添加
扩展:其实普通函数里面也实现了call方法
内容总结
以上是互联网集市为您收集整理的python装饰器全部内容,希望文章能够帮你解决python装饰器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。