python装饰器
编辑之前在知乎上看到了一个很形象的比喻来描述装饰器 它是这么说的:
内裤可以用来掩盖 但是到了冬天没办法御寒 聪明的人发明可长裤有了长裤后就不会冷了 装饰器就是这里说的长裤 在不影响内裤作用的前提下给我们的身体提供了保暖的功效
来认识下装饰器吧??什么是装饰器?
装饰器本身是一个python函数 可以在不改动其他函数的前提下对函数得到功能进行扩充通常情况下装饰器用于下列情况中:
1)引入日志
2)函数执行时间的统计
3)执行函数前预备处理
4)执行函数后清理功能
5)权限校验
6)缓存
例:
def test_one():
print('test_one')
def test_one():
print('test_one')
print('test_one is running')
test_one()
但是如果函数test_two() 函数 test_three()都有类似的需求 那么现在这样的做法会出现大量重复的代码 为了减少重复的代码我们就要设置一个新的函数专门记录函数执行日志谁需要记录执行日志就把谁作为参数传递 实例如下:
def print_log(func):
print("函数正在运行中")
func()
def test():
print('test')
print_log(test)
按照上述代码将函数作为参数传递虽然可以实现功能但是破坏了原有代码的逻辑结构如果要求已经实现的函数不能修改只能扩展即遵循 封闭开放的原则!那么是不允许在函数test内部进行修改的
装饰器可以满足上述要求 在python中以@开头下面 我们写一个简单的装饰器
def wrap(func):
print('正在装饰')
def inner():
print('正在验证权限')
func()
return inner
@wrap
def test():
print('test')
test()
下面我们分析以下程序的执行过程
1)当程序执行test()时 发现函数 test()上面有装饰器@warp 所以会先执行@warp@warp等价于test=warp(test)可以拆分俩步:
1 执行wrap(test) 将函数名 test作为参数传递给wrap 在调用wrap函数的过程中首先会执行print语句 输出正在装饰 然后会将形参func指向test()函数体并将inner()函数的引用返回给wrap(test)作为wrap(test)的返回值
2 将wrap(test)的返回值赋给test 此时 test指向inner()函数
到此我们完成了test()的装饰
- 点赞
- 收藏
- 关注作者
评论(0)