广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python函数式编程装饰器的示例分析
  • 806
分享到

Python函数式编程装饰器的示例分析

2023-06-29 08:06:24 806人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章给大家分享的是有关python函数式编程装饰器的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、装饰器的本质:装饰器(decorator)本质是函数闭包(function closure)的语法

这篇文章给大家分享的是有关python函数式编程装饰器的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

一、装饰器的本质:

装饰器(decorator)本质是函数闭包(function closure)的语法糖(Syntactic sugar)

函数闭包(function closure):

函数闭包是函数式语言(函数是一等公民,可作为变量使用)中的术语。函数闭包:一个函数,其参数和返回值都是函数,用于增强函数功能面向切面编程(AOP)

import time# 控制台打印100以内的奇数:def print_odd():    for i in range(100):        if i % 2 == 1:            print(i)# 函数闭包:用于增强函数func:给函数func增加统计时间的功能:def count_time_wrapper(func):    def improved_func():        start_time = time.time()        func()        end_time = time.time()        print(f"It takes {end_time - start_time} S to find all the odds in range !!!")    return improved_funcif __name__ == '__main__':    # 调用count_time_wrapper增强函数    print_odd = count_time_wrapper(print_odd)    print_odd()

闭包本质上是一个函数,闭包函数的传入参数和返回值都是函数,闭包函数得到返回值函数是对传入函数增强后的结果。

日志装饰器:

def log_wrapper(func):    """    闭包,用于增强函数func: 给func增加日志功能    """    def improved_func():        start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))  # 起始时间        func()  # 执行函数        end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))  # 结束时间        print("Logging: func:{} runs from {} to {}".fORMat(func.__name__, start_time, end_time))    return improved_func

二、装饰器使用方法:

通过装饰器进行函数增强,只是一种语法糖,本质上跟上个程序(使用函数闭包)完全一致。

Python函数式编程装饰器的示例分析

import time# 函数闭包:用于增强函数func:给函数func增加统计时间的功能:def count_time_wrapper(func):    def improved_func():        start_time = time.time()        func()        end_time = time.time()        print(f"It takes {end_time - start_time} S to find all the odds in range !!!")    return improved_funC# 控制台打印100以内的奇数:@count_time_wrapper  # 添加装饰器def print_odd():    for i in range(100):        if i % 2 == 1:            print(i)if __name__ == '__main__':    # 使用  @装饰器(增强函数名) 给当前函数添加装饰器,等价于执行了下面这条语句:    # print_odd = count_time_wrapper(print_odd)    print_odd()

装饰器在第一次调用被装饰函数时进行增强,只增强一次,下次调用仍然是调用增强后的函数,不会重复执行增强!

保留函数参数和返回值的函数闭包:

  • 之前所写的函数闭包,在增强主要功能函数时,没有保留原主要功能函数的参数列表和返回值。

  • 一个保留参数列表和返回值的函数闭包写法:

def general_wrapper(func):    def improved_func(*args, **kwargs):        # 增强函数功能:        ret = func(*args, **kwargs)        # 增强函数功能:        return ret    return improved_func

优化装饰器(参数传递、设置返回值): 

import time# 函数闭包:用于增强函数func:给函数func增加统计时间的功能:def count_time_wrapper(func):    # 增强函数:    def improved_func(*args, **kwargs):        start_time = time.time()        result = func(*args, **kwargs)        end_time = time.time()        print(f"It takes {end_time - start_time} S to find all the odds in range !!!")        # 原函数返回值        return result    return improved_func# 计算0-lim奇数之和:@count_time_wrapperdef count_odds(lim):    cnt = 0    for i in range(lim):        if i % 2 == 1:            cnt = cnt + i    return cntif __name__ == '__main__':    result = count_odds(10000000)    print(f"计算结果为{result}!")

三、多个装饰器的执行顺序:

# 装饰器1:def wrapper1(func1):    print("set func1")  # 在wrapper1装饰函数时输出    def improved_func1(*args, **kwargs):        print("call func1")  # 在wrapper1装饰过的函数被调用时输出        func1(*args, **kwargs)        return None    return improved_func1# 装饰器2:def wrapper2(func2):    print("set func2")  # 在wrapper2装饰函数时输出    def improved_func2(*args, **kwargs):        print("call func1")  # 在wrapper2装饰过的函数被调用时输出        func2(*args, **kwargs)        return None    return improved_func2@wrapper1@wrapper2def original_func():    passif __name__ == '__main__':    original_func()    print("------------")    original_func()

Python函数式编程装饰器的示例分析

这里得到的执行结果是,wrapper2装饰器先执行,原因是因为:程序从上往下执行,当运行到:

@wrapper1@wrapper2def original_func():    pass

这段代码时,使用函数闭包的方式解析为:

original_func = wrapper1(wrapper2(original_func))

所以先进行wrapper2装饰,然后再对被wrapper2装饰完成的增强函数再由wrapper1进行装饰,返回最终的增强函数。

Python函数式编程装饰器的示例分析

四、创建带参数的装饰器:

装饰器允许传入参数,一个携带了参数的装饰器将有三层函数,如下所示:

import functoolsdef log_with_param(text):    def decorator(func):        @functools.wraps(func)        def wrapper(*args, **kwargs):            print('call %s():' % func.__name__)            print('args = {}'.format(*args))            print('log_param = {}'.format(text))            return func(*args, **kwargs)        return wrapper    return decorator@log_with_param("param!!!")def test_with_param(p):    print(test_with_param.__name__)if __name__ == '__main__':    test_with_param("test")

将其 @语法 去除,恢复函数调用的形式:

# 传入装饰器的参数,并接收返回的decorator函数decorator = log_with_param("param!!!")# 传入test_with_param函数wrapper = decorator(test_with_param)# 调用装饰器函数wrapper("I'm a param")

感谢各位的阅读!关于“Python函数式编程装饰器的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: Python函数式编程装饰器的示例分析

本文链接: https://www.lsjlt.com/news/323855.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python函数式编程装饰器的示例分析
    这篇文章给大家分享的是有关Python函数式编程装饰器的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、装饰器的本质:装饰器(decorator)本质是函数闭包(function closure)的语法...
    99+
    2023-06-29
  • python函数式编程的示例分析
    这篇文章给大家分享的是有关python函数式编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能,该语言通俗...
    99+
    2023-06-14
  • python装饰器的示例分析
    这篇“python装饰器的示例分析”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“python装饰器的示例分析”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获,下面让我们...
    99+
    2023-06-06
  • Python函数式编程之装饰器
    原则:对修改是封闭的,对扩展是开放的,方法:一般不修改函数或者类,而是扩展函数或者类一:装饰器 允许我们将一个提供核心功能的对象和其他可以改变这个功能的对象’包裹‘在一起, 使用装饰对象的任何对象与装饰前后该对象的交互遵循完全...
    99+
    2023-01-30
    函数 Python
  • JavaScript函数式编程示例分析
    目录函数式编程函数柯理化(Curring)Compose场景案例总结函数式编程 1.函数式编程指的是函数的映射关系 2.vue3、react16.8的函数组件推动了前端函数编程 3....
    99+
    2022-11-13
    JavaScript函数式编程 JS函数式编程
  • JavaScript函数式编程的示例分析
    这篇文章给大家分享的是有关JavaScript函数式编程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。看过许多关于函数式编程的讲解,但是其中大部分是停留在理论层面,还有...
    99+
    2022-10-19
  • python装饰器代码的示例分析
    这篇文章主要介绍python装饰器代码的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.装饰器通用模型def wrapper(fn):    def&nbs...
    99+
    2023-06-29
  • Python编程中装饰器的使用示例解析
    装饰函数和方法 我们先定义两个简单的数学函数,一个用来计算平方和,一个用来计算平方差: # get square sum def square_sum(a, b): return a**2 + b*...
    99+
    2022-06-04
    示例 Python
  • PHP中装饰器模式的示例分析
    这篇文章主要介绍了PHP中装饰器模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Gof类图及解释GoF定义:将一个类的接口转换成客户希望的另外一个接口。Adapt...
    99+
    2023-06-20
  • js中函数式编程的示例分析
    这篇文章主要为大家展示了“js中函数式编程的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js中函数式编程的示例分析”这篇文章吧。(1)平常写的函数大多...
    99+
    2022-10-19
  • 浅析Python编写函数装饰器
    编写函数装饰器 本节主要介绍编写函数装饰器的相关内容。 跟踪调用 如下代码定义并应用一个函数装饰器,来统计对装饰的函数的调用次数,并且针对每一次调用打印跟踪信息。 class tracer: def ...
    99+
    2022-06-04
    函数 Python
  • 详解Python函数式编程之装饰器
    目录一、装饰器的本质:函数闭包(functionclosure):二、装饰器使用方法:保留函数参数和返回值的函数闭包:三、多个装饰器的执行顺序:四、创建带参数的装饰器:总结一、装饰器...
    99+
    2022-11-13
  • Java装饰者模式的示例分析
    小编给大家分享一下Java装饰者模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!定义装饰者模式:在不改变原有对象的基础之上,动态的将功能附加到对象上,...
    99+
    2023-06-29
  • python装饰器原理源码示例分析
    目录前言一、什么是装饰器二、为什么要用装饰器三、简单的装饰器四、装饰器的语法糖五、装饰器传参六、带参数的装饰器七、类装饰器八、带参数的类装饰器九、装饰器的顺序前言 最近有人问我装饰器...
    99+
    2022-11-12
  • Java函数编程的示例分析
    小编给大家分享一下Java函数编程的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、函数编程Lambda我们可以将lambda表达式视为一个匿名函数,可以将其分配给变量并传递给方法,该方法接受函数接口作为参数。L...
    99+
    2023-06-25
  • python中装饰器信号与槽的示例分析
    这篇文章主要为大家展示了“python中装饰器信号与槽的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中装饰器信号与槽的示例分析”这篇文章吧...
    99+
    2022-10-19
  • python链式函数调用的示例分析
    小编给大家分享一下python链式函数调用的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!链式函数调用你可以在一行代码内调用多个函数。def a...
    99+
    2023-06-27
  • JavaScript中装饰者模式与AOP的示例分析
    这篇文章将为大家详细讲解有关JavaScript中装饰者模式与AOP的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是装饰者模式当我们拍了一张照片准备发朋友圈...
    99+
    2022-10-19
  • JavaScript中的函数式编程实例分析
    这篇文章主要介绍“JavaScript中的函数式编程实例分析”,在日常操作中,相信很多人在JavaScript中的函数式编程实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript中的函数式...
    99+
    2023-07-05
  • 汇编语言的函数式编程实例分析
    这篇文章主要介绍了汇编语言的函数式编程实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇汇编语言的函数式编程实例分析文章都会有所收获,下面我们一起来看看吧。一切都是为了消除副作用要了解函数式编程,我们需要首...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作