python装饰器(详解)

python装饰器(详解)大家好 我是 J 哥 今天我们介绍一下 python 中的装饰器首先我们要了解什么是装饰器 1 什么是装饰器器指的是工具 可以定义成成函数装饰指的是为其他事物添加额外的东西点缀合到一起的解释 装饰器指的定义一个函数 该函数是用来为其他函数添加额外的功能就是拓展原来函数功能的一种函数 2 为何要用装饰器开放封闭原则开放 指的是对拓展功能是开放的封闭 指的是对修改源代码是封闭的装饰器就是在不修改被装饰器对象源代码以及调用方式的前提下为被装饰对象添加新功能 3 如何用 需求

大家好,我是J哥. 今天我们介绍一下python中的装饰器
首先我们要了解什么是装饰器
1、什么是装饰器
器指的是工具,可以定义成成函数
装饰指的是为其他事物添加额外的东西点缀








合到一起的解释: 装饰器指的定义一个函数,该函数是用来为其他函数添加额外的功能 就是拓展原来函数功能的一种函数 

2、为何要用装饰器
开放封闭原则
开放:指的是对拓展功能是开放的
封闭:指的是对修改源代码是封闭的






装饰器就是在不修改被装饰器对象源代码以及调用方式的前提下为被装饰对象添加新功能 

3、如何用

# 需求:在不修改index函数的源代码以及调用方式的前提下为其添加统计运行时间的功能 def index(x, y): time.sleep(3) print('index %s %s' % (x, y)) index(111, 222) # index(y=111,x=222) # index(111,y=222) 
# 解决方案一:失败 # 问题:没有修改被装饰对象的调用方式,但是修改了其源代码 import time def index(x, y): start = time.time() time.sleep(3) print('index %s %s' % (x, y)) stop = time.time() print(stop - start) index(111, 222) 
# 解决方案二:失败 # 问题:没有修改被装饰对象的调用方式,也没有修改了其源代码,并且加上了新功能 # 但是代码冗余 import time def index(x, y): time.sleep(3) print('index %s %s' % (x, y)) start = time.time() index(111, 222) stop = time.time() print(stop - start) 
# 解决方案三:失败 # # 问题:解决了方案二代码冗余问题,但带来一个新问题即函数的调用方式改变了 import time def index(x, y): time.sleep(3) print('index %s %s' % (x, y)) def wrapper(): start = time.time() index(111, 222) stop = time.time() print(stop - start) wrapper() 
# 方案三的优化一:将index的参数写活了 import time def index(x, y, z): time.sleep(3) print('index %s %s %s' % (x, y, z)) def wrapper(*args, kwargs): start = time.time() index(*args, kwargs) # index(3333,z=5555,y=44444) stop = time.time() print(stop - start) wrapper(3333, 4444, 5555) wrapper(3333, z=5555, y=44444) 
# 方案三的优化二:在优化一的基础上把被装饰对象写活了,原来只能装饰index import time def index(x,y,z): time.sleep(3) print('index %s %s %s' %(x,y,z)) def home(name): time.sleep(2) print('welcome %s to home page' %name) def outter(func): # func = index的内存地址 def wrapper(*args,kwargs): start=time.time() func(*args,kwargs) # index的内存地址() stop=time.time() print(stop - start) return wrapper index=outter(index) # index=wrapper的内存地址 home=outter(home) # home=wrapper的内存地址 home('egon') # home(name='egon') 
# 方案三的优化三:将wrapper做的跟被装饰对象一模一样,以假乱真 import time def index(x,y,z): time.sleep(3) print('index %s %s %s' %(x,y,z)) def home(name): time.sleep(2) print('welcome %s to home page' %name) def outter(func): def wrapper(*args,kwargs): start=time.time() res=func(*args,kwargs) stop=time.time() print(stop - start) return res return wrapper # # 偷梁换柱:home这个名字指向的wrapper函数的内存地址 home=outter(home) res=home('egon') # res=wrapper('egon') print('返回值--》',res) 
# 语法糖:让你开心的语法 import time # 装饰器 def timmer(func): def wrapper(*args, kwargs): start = time.time() res = func(*args, kwargs) stop = time.time() print(stop - start) return res return wrapper # 在被装饰对象正上方的单独一行写@装饰器名字 @timmer # index=timmer(index) def index(x, y, z): time.sleep(3) print('index %s %s %s' % (x, y, z)) @timmer # home=timmer(ome) def home(name): time.sleep(2) print('welcome %s to home page' % name) index(x=1, y=2, z=3) home('egon') 

总结无参装饰器模板

def outter(func): def wrapper(*args, kwargs): # 1、调用原函数 # 2、为其增加新功能 res = func(*args, kwargs) return res return wrapper 
def auth(func): def wrapper(*args, kwargs): # 1、调用原函数 # 2、为其增加新功能 name = input('your name>>: ').strip() pwd = input('your password>>: ').strip() if name == 'egon' and pwd == '123': res = func(*args, kwargs) return res else: print('账号密码错误') return wrapper @auth def index(): print('from index') 

好了这就是完整的装饰器了,看到这里留下你痕迹,算是对J哥最大的支持。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208361.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午11:45
下一篇 2026年3月19日 上午11:46


相关推荐

  • PriorityQueue解析

    PriorityQueue解析转载出自于深入理解JavaPriorityQueueJava中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度,将让读者建立对PriorityQueue建立清晰而深入的认识。总体介绍前面以JavaArrayDeque为例讲解了Stack和Q

    2022年4月30日
    39
  • SpringMVC+Spring+Mybatis实现登录注册Demo「建议收藏」

    SpringMVC+Spring+Mybatis实现登录注册Demo「建议收藏」使用环境:MyEclipse/Eclipse+Tomcat+MySql。使用技术:SpringMVC+Spring+Mybatis。实现效果登录页面:密码错误提示登录成功后注册注册成功目录结构一、配置文件beans.xml<?xmlversion=”1.0″encoding=”UTF-8″?><beansxmlns=”http://www.springframework.org/schema/beans”xmlns:x.

    2022年4月30日
    61
  • 分享如何使用PHP将URL地址参数进行加密传输提高网站安全性

    分享如何使用PHP将URL地址参数进行加密传输提高网站安全性

    2021年10月9日
    46
  • N8N Docker 部署教程:Win/Mac 安装命令与终端代理设置指南

    N8N Docker 部署教程:Win/Mac 安装命令与终端代理设置指南

    2026年3月15日
    1
  • latex标记html样式,latex希腊字母

    latex标记html样式,latex希腊字母CSS 布局 HTML 小编今天和大家分享助如何在 latex 写粗体的希腊字母怎样用 latex 加黑数学公式中的小写希腊字母 像是 mathbf tau boldsymbol tau pmb tau 都使用过了 都不行 将以下几行代码保存成一个文件 如 test bold tex 在 winedt 下运行 就会出带黑体小些希腊字母的高斯公式 documentclas journal IE

    2026年3月18日
    2
  • SOAP 协议「建议收藏」

    SOAP 协议「建议收藏」参考链接SOAP教程http协议与soap协议之间的区别SOAPSOAP是基于XML的简易协议,可使应用程序在HTTP之上进行信息交换SOAP提供了一种标准的方法,使得运行在不同的操作系统并使用不同的技术和编程语言的应用程序可以互相进行通信SOAP协议可以简单地理解为:SOAP=RPC+HTTP+XML采用HTTP作为通信协议RPC(RemoteProcedureCallProtocol远程过程调用协议)作为一致性的调用途径XML作为数据传送的格式,从而允许服务提供

    2022年7月12日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号