文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python——装饰器(无参)

2023-01-31 03:18

关注

装饰器

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

无参装饰器 @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)函数


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯