81python装饰器
2023-04-18 15:18:59 时间
业务多的话选择装饰器
- 实现原理:基于@语法和函数闭包,将原函数封装在闭包里,然后将函数赋值为一个新的函数(内层函数),执行函数时再在内层函数中执行闭包中的原函数。
- 实现效果:可以在不改变原函数内部代码 和 调用方式的前提下, 实现在函数执行和执行扩展功能。
- 适用场景:多个函数系统统一在 执行前后自定义一些功能。
装饰器实列:
# 装饰器实例 手写
def outer(origin):
def inner(*args, **kwargs):
# 执行前
res = origin(*args, **kwargs)
# 执行后
return inner
@outer
def func():
pass
func()
下面一步一步指导:看完就很简单了
引出:
def func():
print("我是func函数")
value = (11, 22, 33, 44)
return value
def outer(origin):
def inner():
print("before")
res = origin() # 调用原来的func函数
print("after")
return res
return inner
func = outer(func)
result = func()
print(result)
# output:
before
我是func函数
after
(11, 22, 33, 44)
加装饰器一
"""
@函数名
def xxx():
pass
python内部会自动执行 函数名(xxx),执行完之后,再将结果赋值给 xxx
xxx = 函数名(xxx)
"""
def outer(origin):
def inner():
print("before")
res = origin() # 调用原来的func函数
print("after")
return res
return inner
@outer # func = outer(func)
def func():
print("我是func函数")
value = (11, 22, 33, 44)
return value
result = func()
print(result)
# output:
before
我是func函数
after
(11, 22, 33, 44)
加装饰器二
def outer(origin):
def inner():
print("before")
res = origin() # 调用原来的func函数
print("after")
return res
return inner
@outer
def func1():
print("我是func1函数")
value = (11, 22, 33, 44)
return value
@outer
def func2():
print("我是func2函数")
value = (11, 22, 33, 44)
return value
@outer
def func3():
print("我是func3函数")
value = (11, 22, 33, 44)
return value
func1()
func2()
func3()
# output:
before
我是func1函数
after
before
我是func2函数
after
before
我是func3函数
after
优化
def outer(origin):
def inner(*args, **kwargs):
print("before")
res = origin(*args, **kwargs) # 调用原来的func函数
print("after")
return res
return inner
@outer
def func1(a1):
print("我是func1函数")
value = (11, 22, 33, 44)
return value
@outer
def func2(a1, a2):
print("我是func2函数")
value = (11, 22, 33, 44)
return value
@outer
def func3(a1):
print("我是func3函数")
value = (11, 22, 33, 44)
return value
func1(1)
func2(11, a2=22)
func3(999)
# output:
before
我是func1函数
after
before
我是func2函数
after
before
我是func3函数
after
扩展一
# 扩展1
import functools
def auth(func):
@functools.wraps(func)
def inner(*args, **kwargs):
res = func(*args, **kwargs) # 执行原函数
return res
return inner
@auth
def handler():
pass
handler()
print(handler.__name__) # handler ,如不加 @functools.wraps(func) 就返回的是inner这个函数名字
相关文章
- TP-Link TL-WR840N EU v5 远程代码执行
- PYTHON用户流失数据挖掘:建立逻辑回归、XGBOOST、随机森林、决策树、支持向量机、朴素贝叶斯和KMEANS聚类用户画像
- Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集
- 【赵渝强老师】利用Python完成数据分布特征的分析
- 下个十年,Python的“王者”地位还能保住吗?
- 终于来了!!Pyston v2.0 发布,解决 Python 慢速的救星
- 更快、更强的Python实现:Pyston v2.0发布
- PyTorch 1.7发布,支持CUDA 11、Windows分布式训练
- 将PyTorch投入生产的5个常见错误
- GitHub十大Python项目推荐,Star最高26.4k
- 用 VS Code 写 Python,这8个扩展装上后无敌了!
- 下个10年,Go能取代Python成为开发者的首选语言吗?
- Python即将出局?Julia和Swift能取而代之吗?
- 你真的确定Spring AOP的执行顺序吗
- 对比PyTorch和TensorFlow的自动差异和动态模型
- 后端程序员必备技术栈,如何选择合适的消息队列
- 2020年10月编程语言排行榜:Python即将打败Java,登上第二宝座?
- 9月份Github上热门的Python开源项目
- 同步与异步Python有何不同?
- 微软获GPT-3独家授权,可访问底层代码,API用户继续使用