• Python学习之装饰器


    装饰器出现的原因是因为我们应对新的需求:在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能;它的本质是闭包函数。

    装饰器的结构:

    def timmer(func):
        def inner(*args,**kwargs):
            '''添加函数调用之前的扩展代码'''
            ret = func(*args,**kwargs)
            '''添加函数调用之后的扩展代码'''
            return ret
        return inner

    两个def 两个return互相对应。

    装饰器的设计模式:是开放封闭原则;既对扩展是开放的,对修改是封闭的。

    计算一个函数的运行的时间:

    import time
    def timmer(func):
        #函数名可以当做函数的参数
        def inner():
            start = time.time()
            func()
            end = time.time()
            print(end - start)
        return inner
    
    def hahaha():
        time.sleep(0.1)
        print('aaaa')
    
    # hahaha()
    timmer(hahaha)()

    这个函数可以计算有限的代码运行时间,面对企业大规模的应用这种方法就不可行啦。需要用下面的方法:

    import time
    def timmer(func):
        #函数名可以当做函数的参数
        def inner():
            start = time.time()
            func()
            end = time.time()
            print(end - start)
        return inner
    
    def hahaha():
        time.sleep(0.1)
        print('aaaa')
    
    # hahaha()
    #timmer(hahaha)()
    #我们不能修改这个函数的调用方式
    #也不能修改原代码
    hahaha = timmer(hahaha)  #timmer函数的地址给了hahaha
    hahaha()  #实际上执行的是timmer

    这就是装饰器的简单应用。

    我们需要对这个精简下:

    import time
    def timmer(func):
        #函数名可以当做函数的参数
        def inner():
            start = time.time()
            func()
            end = time.time()
            print(end - start)
        return inner
    @timmer#语法糖必须紧跟着定义的函数
    def hahaha():
        time.sleep(0.1)
        print('aaaa')
    
    # hahaha()
    #timmer(hahaha)()
    #我们不能修改这个函数的调用方式
    #也不能修改原代码
    #hahaha = timmer(hahaha)  #timmer函数的地址给了hahaha
    hahaha()  #实际上执行的是timmer

    如果被装饰的函数有参数传入呢:

    def timmer(func):  #---> hahaha
        def inner(*args,**kwargs):#可以接受任何传入的参数
            #args == (1,2)  kwargs == {}
            #*args == 1,2   **kwargs == a =1,b = 2
            func(*args,**kwargs)  # --->hahaha
        return inner
    
    
    def kkk(a):
        print(a)
    
    kkk = timmer(kkk)
    kkk(1)

    被装饰的函数有返回值呢,通过下面的方式可以解决:

    def timmer(func):  #---> jjj
        def inner(*args,**kwargs):
            ret = func(*args,**kwargs)  # --->ret = jjj()
            return ret
        return inner
    
    
    def jjj():
        return 123
    
    jjj = timmer(jjj)
    print(jjj())  #==>inner
  • 相关阅读:
    关于JAVA中RSA加签解签,私钥加密公钥解密和公钥加密私钥解密代码详解
    Vue使用总结
    使用ReflectionToStringBuilder实现toString方法
    vue 发送短信验证码倒计时
    个人信息打码
    Token注解防止表单的重复提交
    html选择图片后直接预览
    从分布式一致性谈到CAP理论、BASE理论
    node.js 下依赖Express 实现post 4种方式提交参数
    web前端学习笔记(CSS变化宽度布局)
  • 原文地址:https://www.cnblogs.com/1a2a/p/7258034.html
Copyright © 2020-2023  润新知