python无参数装饰器_Python——装饰器(无参)

装饰器

装饰器可以叠加使用,执行是从下到上执行的

无参装饰器@logger

1.它是一个语法糖

2.函数作为它 的形参

3.返回值也是一个函数

4.可以使用 @function 方式,简化调用

注意: 此处的装饰器的定义并不准确,只是方便理解

装饰器和高阶函数

装饰器是高阶函数,但装饰器是对传入函数功能的装饰

装饰器函数的演化过程:

"""

装饰器

一个普通的加法函数,想增强他的功能

"""

defadd(x,y):

returnx + y

"""增加信息输出功能"""

defadd(x,y):

print("call add,x+y")# 日志输出到控制台

returnx + y

"""上面的函数是完成了需求,但是有缺点

1.print语句的耦合度太高

2.加法函数属于业务功能,而输出信息的功能,属于非业务功能代码,不该放在业务函数加法中"""

"""把添加功能移出来"""

deflogger(fn):

print("call add,x+y")

ret = fn(3,4)

returnret

print(logger(add))

deflogger(fn,x,y):

print("call add,x+y")

ret = fn(x,y)

returnret

print(logger(add,3,4))

deflogger(fn,*args,**arges):

print("call add,x+y")

ret = fn(*args,**arges)

returnret

print(logger(add,3,4))

deflogger(fn):

defwrapper(*args,**arges):# 可变位置传参,可变关键字传参

print("call add,x+y")

ret = fn(*args,**arges)# 参数解构

returnret

returnwrapper

print(logger(add)(4,5))

add = logger(add)# add = wrapper

ret = add(4,5)# wrapper(4,5)

装饰器 核心思想

importdatetime

deflogger(fn):

defwrapper(*args,**arges):# 可变位置传参,可变关键字传参

print("前面增强")

start = datetime.datetime.now()

ret = fn(*args,**arges)# 参数解构

delta = (datetime.datetime.now() - start).total_seconds()

print("so fast")ifdelta <5elseprint("so slow")

print("后面增强")

returnret

returnwrapper

@logger# add = logger(add) => add 就是 wrapper

defadd(x,y):# wrapper(4,5)

returnx + y

ret = add(4,5)# wrapper(4,5) => logger(add)(4,5)

print(ret)

理解装饰器:

1.装饰器函数

2.前置功能增强

3.被增强函数

4.后置功能增强

deflogger(fn):# 调用 被装饰的函数

defwrapper(*args,**kwargs):# 传入被装饰函数参数

print("before function")# 前置功能增强

ret = fn(*args,**kwargs)# 使用被装饰函数的功能

print("after function")# 后置功能增强

returnret# 返回被装饰函数的 计算结果

returnwrapper# 返回 被装饰的函数

@logger# 无参装饰器

# @logger <==> add = logger(add) = wrapper # add(x,y) == wrapper(x,y)

defadd(x,y):# 被装饰的函数

returnx + y

add(3,4)

print(add(3,4))

#看似调用add函数,使用了装饰器@logger之后,实际上 调用的是 wraaper(*args,**kwargs)函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值