python函数-装饰器
2024-08-29 19:59:08
python函数-装饰器
1.装饰器的原则--开放封闭原则
开放:对于添加新功能是开放的
封闭:对于修改原功能是封闭的
2.装饰器的作用
在不更改原函数调用方式的前提下对原函数添加新功能
3.装饰器的本质--闭包
4.装饰器
(1)简单的装饰器
def deco(f):
def wrapper():
"""原函数前添加的功能"""
f()
"""原函数后添加的功能"""
return wrapper def func():
print('这是原函数!') func = deco(func)
func()
(2)装饰器的语法糖-----@deco
def deco(f):
def wrapper():
"""原函数前添加的功能"""
f()
"""原函数后添加的功能"""
return wrapper @deco # ——>此处效果等同于 func = deco(func)
def func():
print('这是原函数') func()
(3)带返回值的装饰器
def deco(f):
def wrapper():
"""原函数前添加的功能"""
res = f()
"""原函数后添加的功能"""
return res
return wrapper @deco
def func():
print('这是原函数')
func()
(4)装饰器加参数的固定格式
def deco(f):
def wrapper(*args,**kwargs):
"""原函数前添加的功能"""
res = f(*args,**kwargs)
"""原函数后添加的功能"""
return res
return wrapper @deco
def func(*args,**kwargs):
print('这是原函数')
func()
(5)装饰器的固定格式--wraps版
from functools import wraps def wrapper(func):
@wraps(func)
def inner(*args,**kwargs):
print('在被装饰的函数执行之前做的事')
ret = func(*args,**kwargs)
print('在被装饰的函数执行之后做的事')
return ret
return inner
@wrapper
def holiday(day):
print("新年快乐")
return '好开心'
print(holiday.__name__)
print(holiday.__doc__)
ret = holiday(3)
print(ret) >>>>
holiday
None
在被装饰的函数执行之前做的事
新年快乐
在被装饰的函数执行之后做的事
好开心
(6) 多个装饰器装饰一个函数
def wrapper1(func):
def inner1():
print('wrapper1 ,before func')
func()
print('wrapper1 ,after func')
return inner1 def wrapper2(func):
def inner2():
print('wrapper2 ,before func')
func()
print('wrapper2 ,after func')
return inner2 @wrapper2 # 将inner1进行装饰,即inner1 = wrapper2(inner1) = inner2
@wrapper1 # 先执行这个装饰器,即f = wrapper1(f) = inner1
def f():
print('in f') f() >>>>
wrapper2 ,before func
wrapper1 ,before func
in f
wrapper1 ,after func
wrapper2 ,after func
最新文章
- (转载)SQL去除回车符,换行符,空格和水平制表符
- Dojo框架学习笔记<;一>;
- [转]Java 征途:行者的地图
- {Reship}{Matting}Image Matting
- 扩展easyui 的表单验证
- ANT自动打包U3D安卓项目研究笔记
- [C#]Attribute特性(2)——方法的特性及特性参数
- js将map转换成数组
- .NET多线程执行函数
- ng-cookie 的基本使用
- MyEclipse6.5安装SVN插件的三种方法
- AIX-vi操作-提示Unknown terminal type的问题解决方法
- Java面试12|Linux及Shell脚本
- Hexo 搭建博客 本地运行 常见报错及解决办法
- linux的PAM认证和shadow文件中密码的加密方式
- NHibernate 有好几种数据库查询方式
- LARC Caffe笔记(二) 训练自己的img
- Linux学习杂记
- python学习_条件判断语句_if
- LoadRunner中Vugen-Recording Options选项卡介绍: