python—装饰器

python-装饰器【Decorator】(又名语法糖)
需要掌握知识点
闭包:用人话来讲就是,嵌套定义在非全局作用域里面的函数能够记住它在被定义的时候它所处的封闭命名空间。
函数作用域
全局作用域
局部作用域
*args,**kwargs
步骤一【什么是装饰器】:
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的
返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限
校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷
同代码并继续重用。
简言之:就是一个只增加原函数或对象的功能,却不改变其它属性的函数
步骤二【装饰器结构】:
装饰器结构一
def decorator(func):
def wrapper(*args,**kwargs):
func(*args,**kwargs)
return wrapper

@decorator
def work():
a = 1
装饰器结构二
def decorator(func):
def wrapper(*args,**kwargs):
return func(*args,**kwargs)
return wrapper


@decorator
def work():
a = 1
return a


装饰器结构三
def decorator(*ARGS,**KWARGS)
def out_wrapper(func):
def wrapper(*args,**kwargs):
print('%s %s %s():' % (ARGS,KWARGS,func.__name__))
return func(*args,**kwargs)
return wrapper
return out_wrapper


@decorator("gun","SB",{"r":"qwer"},r="qwer")
def work():
time.sleep(2)
print("开始工作!")
return 1
完成该步骤时装饰器已经完成了 99%,还有1%呢?
仔细的人会发现,此时:
>>> work.__name__
'wrapper'
这样的话就不符合装饰器的理念。怎么完成后面的呢?
步骤三【还原原函数或对象的__name__属性】:
Python内置的functools.wraps就是干这个事的
看一个小程序
import datetime
import time
import functools


def log(*ARGS,**KWARGS):
def decorator(func):
@functools.wraps(func)
def wrapper(*args,**kwargs):
print(datetime.datetime.now())
ret = func(*args,**kwargs)
print(datetime.datetime.now())
print('%s %s %s():' % (ARGS,KWARGS,func.__name__))
return ret + 1
return wrapper
return decorator


@log("gun","SB",{"r":"qwer"},r="qwer")
def work():
time.sleep(2)
print("开始工作!")
return 1
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值