首页 > 其他分享 >装饰器

装饰器

时间:2023-07-16 09:22:06浏览次数:31  
标签:index outer 函数 time print 装饰 def

闭包函数

1.闭:定义在函数内部的函数

2.包:内部函数使用了外层函数名称中的名字

def outer():  #外部函数
    x = 999
    def inner():   #内部函数:使用的是外层函数的返回值
        print('from outer>>>inner',x)
    return inner(外层函数的返回值)
x = 666
res = outer()   #相当于inner(因为打印res,就是返回值inner)
res()   #执行inner

闭包函数实际应用

函数体传参方式:

1.形参

def index(username):     #直接通过形参传
    print(username)  

index('jason')即可调用 

2.闭包

def outer(username):#为了让里面的名字都可以变,使用形参(由于已经使用了一个外包了,就不使用了)
    def index():
        print(username)
    return(index)
res = outer('jason') #这里的res就是index
res() #调用index函数

装饰器简介

装饰器不是新知识的,就是前几天学习的名称空间/函数名/闭包函数。。。的产物

本质:不改变越来的调用方式和内部代码的情况下给装饰器添加新的功能

原则:对扩展开放,对修改封闭

小知识点:
①import time
print(time.time())  #1647568920.168808
'''上述的数字是时间戳:1970年1月1日0时0分0秒距离刚刚代码运行间隔的秒数'''

②time.sleep(3)  #让程序原地等待三秒
统一测量函数执行时间
import time
def index():
    time.sleep(3)
    print('from index')
'''现在给index增加一个统计执行时间的功能'''

 start_time = time.time() # 函数执行之前获取一个时间戳

index()
end_time = time.time() # 函数执行之后获取一个时间戳
print(end_time - start_time) # 两个时间戳的差值就是函数的执行

装饰器进化过程

简易版本 

在很多地方都需要执行统计index函数执行时间的代码
在不同的地方需要执行相同的代码 >>>: 函数

import time
def index():
    time.sleep(1)
    print('from index')


def outer(func):  # 真正的index被outer局部名称空间func存储了
    def get_time():
        start_time = time.time()  # 函数执行之前获取一个时间戳
        func()  # 调用了真正的index函数
        end_time = time.time()  # 函数执行之后获取一个时间戳
        print(end_time - start_time)  # 两个时间戳的差值就是函数的执行时间
    return get_time
index = outer(index)#右边调用outer函数,返回get_time,调用出get_time函数,测量函数index时间(这个时候的func就是index)
index
()#调用get_time函数
这里的左边的index是普通变量名,也可以是a(狸猫换太子,为了后面调用时候一样,其实这里左边的index是get_time)

进阶版本装饰器
# 解决的是参数问题
def outer(func_name):
    def get_time(*args, **kwargs):
        start_time = time.time()
        func_name(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)
    return get_time
完整版本装饰器
# 解决的是返回值问题
def outer(func_name):
    def get_time(*args, **kwargs):
        start_time = time.time()
        res = func_name(*args, **kwargs)  # 执行真正的index函数
        end_time = time.time()
        print(end_time - start_time)
        return res  #此时的res就是index函数,res的返回值就是index的返回值
    return get_time

装饰器模板!

'''编写装饰器其实有一套固定的代码 不需要做任何理解'''
def outer(func_name):  # func_name用于接收被装饰的对象(函数)
    def inner(*args, **kwargs):
        print('执行被装饰函数之前 可以做的额外操作')
        res = func_name(*args, **kwargs)  # 执行真正的被装饰函数
        print('执行被装饰函数之后 可以做的额外操作')
        return res  # 返回真正函数的返回值
    return inner

  装饰器语法糖

 #仅仅是让代码编写的更加好看、简洁!!!
def outer(func_name):
    def inner(*args, **kwargs):
        print('执行函数之前的操作')
        res = func_name(*args, **kwargs)
        # 额外操作
        return res
    return inner
index = outer(index)  #左边的index是outer函数的返回值inner(但是这一行太low了!)
index()  #相当于调用inner函数
print(index)  #打印inner函数的返回值res,而res的返回值就是index的返回值




以后这么写
@outer  # 等价于 index = outer(index)    #相当于装饰器直接装上了,方便!!
def index(*args, **kwargs):
    print('from index')


以后调用,直接用
index()
看返回值也直接用
print(index)

装饰器修复技术

防止有些人查看位置,看到位置改变,比如使用print打印函数位置,前后变化
用help去看指定函数的注释信息,eg help(home)  所有有瑕疵

# # 做到比真的还要真 但是本质其实没有变 from functools import wraps def outer(func_name): @wraps(func_name) def inner(*args, **kwargs): print('执行被装饰对象之前可以做的操作') res = func_name(*args, **kwargs) return res return inner @outer def index(): print('from index')

 

标签:index,outer,函数,time,print,装饰,def
From: https://www.cnblogs.com/Milk1/p/17557104.html

相关文章

  • python踩坑: 装饰器类的局部缓冲值
    test.py:#coding:utf8importtimeimportthreadingimportfunctoolsclassMyThread(threading.Thread):def__init__(self,filename,fps):self.filename=filenameself.fps=fpssuper().__init__()defrun(self):......
  • python 装饰器
    目录装饰器应用场景装饰器#装饰器,反复的验证状态,从而判断是否继续下一步。经常用来判断用户的登陆状态。比如flask,他的很多东西都是装饰器#装饰器依赖闭包deftest():print('>>>text>>>')#类比a=10b=a,a=0是声明整数b=a是声明函数。defalex(t):print(......
  • 自定义参数类型断言装饰器
    代码frominspectimportsignaturefromfunctoolsimportwrapsdeftypeassert(*ty_args,**ty_kwargs):defdecorate(func):ifnot__debug__:returnfuncsig=signature(func)#获取函数签名bound_types=sig.bind_parti......
  • 重温设计模式 --- 装饰器模式
    引言装饰器模式是一种结构型设计模式,它允许在不改变原始对象的情况下,通过将其包装在一个装饰器对象中,来动态地添加额外的功能。装饰器模式的核心思想是,将一个对象放在另一个对象的外面,以给原始对象添加新的行为。这个“另一个对象”就是装饰器(Decorator),它持有一个原始对象(Compon......
  • python 执行超时装饰器
    代码:importsignalclassTimeoutError(Exception):passdeftimeout(seconds=10,error_message='Timeout'):defdecorator(func):defwrapper(*args,**kwargs):def_handle_timeout(signum,frame):raiseTi......
  • python闭包_装饰器
    6.python高级知识-闭包装饰器/demo02_闭包.py#-*-coding:utf-8-*-#第一种方法================================#每次都更具汇率和钱都写一遍#这种方法是太烦了print("第一种方法")rate_usa=0.7money=100#print(rate_usa*money)print("第一种方法结束")#......
  • 高级编程技巧揭秘!精通Python装饰器,打造灵活强大的代码结构!
    装饰器是Python中一种强大而灵活的编程技巧,它可以用于修改或扩展函数的行为,同时又不需要修改函数的源代码。本文将介绍Python中的装饰器的基本概念、使用方法以及高级技巧,帮助你从入门到精通装饰器的使用。一、基本概念在深入学习装饰器之前,我们首先需要了解一些基本概念。1.1......
  • 高阶函数, 装饰器的编写
    符合如下之一特点的即为高阶函数:接受函数名作为形参返回值包含函数名错误写法:  装饰器函数  原理: 正确的装饰器写法: ......
  • 装饰者模式
    目录1.概述2.结构3.案例4.使用场景5.JDK源码解析6.代理和装饰者的区别1.概述我们先来看一个快餐店的例子。快餐店有炒面、炒饭这些快餐,可以额外附加鸡蛋、火腿、培根这些配菜,当然加配菜需要额外加钱,每个配菜的价钱通常不太一样,那么计算总价就会显得比较麻烦。使用继承......
  • python: 举例说明什么是装饰器
    python:举例说明什么是装饰器━━━━━━━━━━━━━━━━━━━━━━━━━装饰器是Python中的一种高级特性,它允许我们在不修改原函数代码的情况下,对函数进行功能的扩展和修改。装饰器实际上是一个函数,它可以接受一个函数作为输入,并返回一个新的函数。下面是一个简单的......