• python中的装饰器


    什么是装饰器:可以理解为添加新的功能。
    定义:在不改变原被装饰的函数的源代码以及调用方式下,为其添加额外的功能。
    装饰器形成的过程 *args 接收:聚合 调用:打散
    import time
    print(time.time())
    time.sleep(3)#让程序执行到此位置的时候停留
    print('vhdihfiufhui')
    def timer(f):#计算函数的执行时间
    start = time.time()
    f()
    end=time.time()
    print(end-start)
    def func():
    time.sleep(1)
    print('hahahhah')

    timer(func)


    装饰器的作用:
    在不改变原函数的调用方式的情况下,在函数的前后添加功能
    装饰器的本质是:闭包
    原则:开放封闭原则

    1.对扩展是开放的

    2.对修改是封闭的

       

    装饰器的固定模式

    def func():
    time.sleep(2)
    print('哈哈哈哈哈')

    def timmer(func): #闭包 ----》指向func的内存地址 timmer就是一个装饰器函数
    def inner():
    start=time.time()
    func() #被装饰的函数
    end=time.time()
    print(end-start)
    return inner

    func=timmer(func) #先执行后面的function就是第一个函数
    func() #实际执行innner
    timmer就是一个装饰器函数,只是对一个函数,有一些装饰作用

    不想修改函数的调用方式,但是还想在原来的函数前后添加功能,so 使用装饰器

    语法糖:使代码更便捷
    @timmer(装饰器函数的名字) 写在被装饰的函数的上面 这个就相当于:func=timmer(func)

    练习:
    def wrapper(func):# 传入func:被装饰的函数 *****
    def inner(*args,**kwargs):
    print('在被装饰的函数之前做的事')
    ret=func(args,**kwargs) #func被装饰的函数 参数是inner传给他的
    print('在被装饰的函数执行之后做的事')
    return ret
    return inner
    @wrapper #holiday=wrapper(holiday)
    def holiday(day):
    print('放假%s'%day)
    return '哈哈哈哈哈'

    ret=holiday(3) #调用holiday
    print(ret)

    #装饰器的固定格式一:
    def timmer(func):
    def inner(*args,**kwargs):
    '''执行函数之前要做的'''
    re=func(*args,**kwargs)
    '''执行函数之后要做的'''
    return re
    return inner
    装饰器的固定格式二---wrappet版
    from functools import wraps
    def deco(func):
    @wraps(func)#加在最内侧函数最上方
    def wrapper(*args,**kwargs):
    return func(*args,**kwargs)
    return wrapper



    装饰器的进阶
    functools.wraps
    带参数的装饰器
    多个装饰器装饰同一个函数
    def haha():
    print('hahah')
    '''
    一个打印哈哈的函数
    '''
    print(haha.__name__)#查看函数(字符串)名
    print(haha.__doc__)#查看文本的函数


    加入:
    from functools import wraps
    @wraps(func)
    能查看函数的名字和文本 而不是装饰器的信息

  • 相关阅读:
    SpringBoot 拦截器
    SpringBoot学习笔记1
    mysql学习1
    mybatis运行原理学习
    js学习2
    设计原则
    mybatis学习1
    spring mvc
    Jenkins流水线部署maven不同模块服务到不同服务器运行
    L2Dwidget让自己的vue项目骚起来
  • 原文地址:https://www.cnblogs.com/lxx99/p/11694174.html
Copyright © 2020-2023  润新知