装饰器

作者: 慕知 | 来源:发表于2021-08-12 10:27 被阅读0次
    装饰器
    1) 示例:使用装饰器,判断程序运行的时间
    #前提
    import time
    def index():
        print('hello word lalala')
        time.sleep(3) # 假如这个程序需要运行3s
    
    index()
    
    
    
    
    
    
    #方案一:修改了源代码(不可)
    import time
    def index():
        start=time.time()
        print('hello world lalala')
        time.sleep(3)
        stop=time.time()
        print(stop-start)
    
    index()
    # hello world lalala
    # 3.0051140785217285     # 设定的时间3s
    
    
    
    
    
    
    
    
    
    
    
    
    
    # 方案2:反复写代码,反复一串代码调用
    import time
    def index():
        print('hello world lalala')
        time.sleep(3)
    
    start=time.time()
    index()
    stop=time.time()
    print(stop-start)
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    # 方案3:基于方案2,把调用的那一串代码定一个函数,直接调用函数
    # 缺点:写死了调用的函数,只能调用index,执行index函数的那一串代码;而且改变了调用方式,不再是调用index()
    import time
    def index():
        print('hello world lalala')
        time.sleep(3)
    
    def wrapper():
        start=time.time()
        index()
        stop=time.time()
        print(stop-start)
    
    wrapper()
    # hello world lalala
    # 3.005214214324951
    
    
    
    
    
    
    
    
    
    
    
    
    
    # 方案4:
    import time
    def index():
        print('hello world lalala')
        time.sleep(3)
    
    def outter(func):        #func是一个参数(这里的参数是一个函数),就不会把上面的indx函数写死
        def warpper():
            start=time.time()
            func()            # 调用参数(即一个函数)
            stop=time.time()
            print(stop-start)
        return warpper        # return返回warpper,其实执行outter这个函数就是调用wrapper
    
    index=outter(index)          #index可以起其他任意名字,但是还是叫index,就不会改变调用方式
    print(index)
    # <function outter.<locals>.warpper at 0x1007af790>   # 调用的函数地址(注意这里不是原来的index的函数值,是wrapper的内存地址)
    index()
    # hello world lalala
    # 3.0009541511535645
    
    
    
    
    
    
    
    
    # 方案5:(最终方案)  (加入了参数,源代码额返回值也会返回,给用户还是在用源代码的感觉)
    import time
    def index(x,y,z):
        print('hello world lalala')
        time.sleep(3)
        return x,y,z
    
    def outter(func):
        def wrapper(*args,**kwargs):
            start=time.time()
            res=func(*args,**kwargs)
            stop=time.time()
            print(stop-start)
            return res
        return wrapper
    
    index=outter(index)
    res=index(1,2,3)        #res可以随便定义
    print(res)
    # hello world lalala
    # 3.005371332168579
    # (1, 2, 3)      # 返回值一起得到(相当于源代码执行结果一样)
    
    
    
    
    
    # 以上如果要调用其他的函数,调用一样功能查看运行时间,只需要如下
    调用函数名=outter(调用函数名)
    res=函数名(参数)
    print(res)
    
    
    2) 总结 -- 装饰器
    ## 百搭装饰器
    # def outter(func):
    #     def wrapper(*args,**kwargs):
    #         res=func(*args,**kwargs)
    #         return res
    #     return wrapper
    
    
    
    
    from functools import wraps
    
    def outter(func):
        @wraps(func)
        def wrapper(*args,**kwargs):
            inp_name=input('username:')
            inp_pwd=input('password:')
            if inp_name == 'mz' and inp_pwd == '123':
                res=func(*args,**kwargs)
                return res
            else:
                print('认证失败')
        return wrapper
    
    @outter      # 相当于home=outter(home)
    def home(name):        # 这里的name给 print('hello %s' % name) 使用返回值用
        res='这是home函数'
        print('hello %s' % name)
        return [res]
    
    
    
    res=home('mz')
    print(res)
    # username:mz
    # password:123
    # hello mz
    # ['这是home函数']
    
    
    
    
    res=home('egon')
    print(res)
    # username:mz
    # password:123
    # hello egon
    # ['这是home函数']
    
    
    
    
    res=home('bb')
    print(res)
    # username:bbbbbbb
    # password:123456
    # 认证失败
    # None
    
    
    

    相关文章

      网友评论

          本文标题:装饰器

          本文链接:https://www.haomeiwen.com/subject/dkglbltx.html