Python——装饰器(无参)
admin
2023-07-20 16:02:01
0

装饰器

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

无参装饰器 @logger

1.它是一个语法糖

2.函数作为它 的形参

3.返回值也是一个函数

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

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

装饰器和高阶函数

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

装饰器函数的演化过程:

"""

装饰器

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

"""

def add(x,y):

   return x + y

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

def add(x,y):

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

   return x + y

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

1.print语句的耦合度太高

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

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

def logger(fn):

   print("call add,x+y")

   ret = fn(3,4)

   return ret

print(logger(add))

def logger(fn,x,y):

   print("call add,x+y")

   ret = fn(x,y)

   return ret

print(logger(add,3,4))

def logger(fn,*args,**arges):

   print("call add,x+y")

   ret = fn(*args,**arges)

   return ret

print(logger(add,3,4))

def logger(fn):

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

       print("call add,x+y")

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

       return ret

   return wrapper

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

add = logger(add) # add = wrapper

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

装饰器 核心思想

import datetime

def logger(fn):

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

       print("前面增强")

       start = datetime.datetime.now()

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

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

       print("so fast") if delta < 5 else print("so slow")

       print("后面增强")

       return ret

   return wrapper

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

def add(x,y): # wrapper(4,5)

   return x + y

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

print(ret)

理解装饰器:

1.装饰器函数

2.前置功能增强

3.被增强函数

4.后置功能增强


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

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

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

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

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

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

   return wrapper                  # 返回 被装饰的函数

@logger                             # 无参装饰器

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

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

   return x + y

add(3,4)

print(add(3,4))

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


相关内容

热门资讯

伊美谈判相关斡旋方21日在埃及... 新华社德黑兰6月19日电(记者陈霄 沙达提)据伊朗伊斯兰共和国广播电视台19日报道,埃及和巴基斯坦当...
减少国家干预,古巴通过170余... 据凤凰卫视报道,古巴总理马雷罗6月18日在会上公布了170多项举措,并获得一致通过。这些举措旨在减少...
郑州一汽车用品商城起火,有楼栋... 极目新闻记者 李贤诚6月19日晚,郑州市金水区居民陈先生反映,离他家百余米处的宏达国际车业广场突发火...
伊朗外长:美应对任何违反谅解备... 当地时间6月19日,伊朗外长阿拉格齐与巴基斯坦副总理兼外长达尔通电话。双方就地区局势交换了意见。通话...
科技创新如何改变普通人的生活 科技创新, 听起来好似实验室里那种高深莫测的课题, 事实上呢, 它已然静悄悄地走入了你我的平常生活里...
校长喊你吃饺子!大学最香最暖的... 又是一年毕业季,离别依依,情意浓浓。在这离别时刻,大连东软信息学院校长郭权走进食堂,挽起袖子,与毕业...
全球可用模型第一!智谱上线并开... 国产大模型慢慢追上来了! 6月17日,智谱上线并开源新一代旗舰大模型GLM-5.2,主攻“长程任务...
全球智能手机销量连续第九周同比... 【CNMO科技消息】市场研究机构Counterpoint Research最新发布的周度销量追踪数据...
2026年抱箍太阳能路灯区域深... 抱箍太阳能路灯是一种无需预埋基础、通过抱箍结构直接固定在现有灯杆上的太阳能照明产品,其安装灵活、适配...
从前的盟友变成了拆台者,这是特... 以色列失控了!特朗普亲自签署备忘录数小时之后,以色列悍然对黎巴嫩发动攻击,并狂言“整个黎巴嫩都必须燃...