首页 > 其他分享 >装饰器

装饰器

时间:2023-12-20 20:58:52浏览次数:22  
标签:outer ee add inner time 装饰 def

1.装饰器的作用

在不改变原函数代码和调用方式的基础上,为它增加新功能

2.装饰器原理

import time

def add(a, b):
    time.sleep(1)
    return a + b

1.需求:统计add的运行时间

start_time = time.time()
add(3,4)
end_time = time.time()
print('运行时间是:',end_time-start_time)

2.需求:写一个通用的,以后只要统计任意函数运行时间,都使用通用的

def outer(func):
    start_time = time.time()
    func(3,4)
    end_time = time.time()
    print('运行时间是:', end_time - start_time)
outer(add)

虽然能实现需求,但是改变了调用方式,不行
--->优化

def outer(func):
    def inner(a,b):
        start_time = time.time()
        res = func(a,b)
        end_time = time.time()
        print('运行时间是:', end_time - start_time)
        return res
    return inner
inner=outer(add)
# 调用inner就是在执行,inner内部包了add函数,inner叫闭包函数,
# 闭包函数:定义在外部,对内部作用域有引用
inner() # 还是改变了调用方式

--->继续优化
3.实现需求,下面这种就是装饰器

def outer(func):
    def inner(a,b):
        start_time = time.time()
        res = func(a,b)
        end_time = time.time()
        print('运行时间是:', end_time - start_time)
        return res
    return inner

add = outer(add)
add(3,4) # 本质调用inner,add 本质就是inner,inner要能接收a,b,并且要有返回结果

4.以后想装饰哪个函数就可以直接使用,按照如下操作,比较麻烦

def ee():
    print('ee')

ee = outer(ee)
ee()

5.语法糖,以后只要按如下方式编写代码,就能实现上诉功能

@outer  # 等同于ee = outer(ee) 语法糖会把被装饰器的函数ee,当做参数,传入outer,并且把outer的执行结果,返回赋值给ee
def ee():
    print('ee')
ee()

以后ee其实已经不是ee了,是inner了,执行ee本质在执行inner

3.装饰器模板

def outer(func):
    def inner(*args,**kwargs):
        # 被装饰器函数,执行之前做的
        start_time = time.time()
        res = func(*args,**kwargs)
        end_time = time.time()
        # 被装饰器函数,执行之后做的
        print('运行时间是:',end_time-start_time)
        return res

    return inner

@outer
def add(a, b):
    time.sleep(2)
    return a + b
add(1,2)

标签:outer,ee,add,inner,time,装饰,def
From: https://www.cnblogs.com/guaguaisnotsweet/p/17917540.html

相关文章

  • python 装饰器
    课堂上学习的装饰器统计函数的执行时间  defouter(func):definner(*args,**kwargs):start_time=time.time()res=func(*args,**kwargs)end_time=time.time()returnres,end_time-start_timereturninner@outerdefadd......
  • WPF 装饰器 、 转换器
    十年河东,十年河西,莫欺少年穷学无止境,精益求精装饰器参考:https://www.cnblogs.com/xietianjiao/p/11239558.html wpf转换器详情参考:https://www.cnblogs.com/zh7791/p/9311332.html单值转换器需继承自IValueConverterpublicclassMyNumberConverter:IValueConvert......
  • 异步记录第三方接口调用日志的优雅实现(HttpClient+装饰者模式+异步线程池)
    对于第三方接口调用日志这个功能,笔者在工作中曾见过以下两种方式:Restemplate+装饰者模式+MQ实现网关监控+Feign拦截器+观察者模式实现其中观察者模式的实现是我最为佩服的设计,个人认为以上两种实现都显得略过臃肿,应该简化设计,让异步记录的实现更加简洁优雅,因此产生了这样......
  • Python装饰器:深入探索功能增强的神奇工具(特点+应用+举例)
    Python装饰器是一项强大的特性,它允许程序员在不改变函数或类本身的情况下,增加、扩展或修改它们的行为。从日志记录到权限验证,再到性能分析和缓存,装饰器在Python编程中发挥着重要的作用。本文将深入探讨装饰器的各个方面,从基本概念到实际应用,带您领略装饰器的神奇之处。装饰器是Pyth......
  • Python 以类作为装饰器 几种使用场景
    1.原函数、装饰器都没有参数代码:classTest:def__init__(self,func):print('Bein__init__process...')self.__func=funcdef__call__(self):print("...Startdecorate...")self.__func()prin......
  • ATM坤坤机装饰器版
    【一】需求#ATM:提款姬#defsave_data(file_path,)#user_pwd_dict={}#文本:dream-521#dream,521#user_info.txt:每一个人的信息就是一行#dream_flow.txt:#print(time.localtime())#注册:存储到文件中用户名-登录密码-年龄-银行卡号(1314)-......
  • ATM无参装饰器
    ATM无参装饰器版注册:存储到文件中用户名-登录密码-权限登录:直接将用户信息从文件中取出,然后进行比对用户名-密码取款:验证你的取款密码,更改余额余额(1000),记录你的提款信息--文件里-加时间转账:验证你的取款密码,更改余额目标银行卡号去转记录你的提......
  • 装饰器
    装饰器1.装饰器再不修改被装饰对象的源代码和调用方式的的前提下为装饰对象添加额外的功能1.1装饰器分类分为无参装饰器和有参装饰器无参装饰器#无参装饰器模版defouter(func):definner():'''这里写调用func函数之前的逻辑'''res=func()......
  • 九、@Watch装饰器:状态变量更改通知
    @Watch应用对状态变量的监听。如果开发者需要关注某个状态变量的值是否改变,可以使用@Watch为状态变量这种回调函数。@Watch用于监听状态变量的变化,当状态变量变化时,@Watch的回调方法将被调用。@Watch在ArkUI框架内部判断数值有无更新使用的是严格相等(===),遵循严格相等规范。当在严......
  • 装饰器
    装饰器一、什么是装饰器通俗的讲就是用来装饰对象的工具,这里被装饰的对象和用来装饰的装饰器都可以可以是任意的课调用的对象概括的来讲,装饰器就是在不修改被装饰对象的源代码和调用方式的基础下为被装饰对象添加额外的功能二、装饰器的用途装饰器在装饰时,应避免修改被装......