• Title


    一、装饰器含义

      装饰器本质就是函数,为其它函数添加附加功能

    二、装饰器原则

      1.不修改被修饰函数的代码

      2.不修改被修饰函数的调用方式

    三、装饰器知识

      装饰器 = 高阶函数 + 函数嵌套 + 闭包

    四、装饰器介绍

      1.装饰器基本框架
    def timer(func):    #func为被修饰函数
        def wrapper():   #函数嵌套
            func()      #执行func函数
        return wrapper
      2、基本装饰器(基本框架+参数+功能+返回值+使用装饰器+语法糖@)
    import time
    
    def timmer(func): #func=test
        def wrapper():
            # print(func)
            start_time=time.time()
            func() #就是在运行test()
            stop_time = time.time()
            print('运行时间是%s' %(stop_time-start_time))
        return wrapper
    
    @timmer #test=timmer(test)  timmer执行后会返回wrapper地址赋值给test
    def test():
        time.sleep(3)
        print('test函数运行完毕')
    
    test()
      3.加上返回值的装饰器
    import time
    
    def timmer(func): #func=test
        def wrapper():
            # print(func)
            start_time=time.time()
            res = func() #就是在运行test()
            stop_time = time.time()
            print('运行时间是%s' %(stop_time-start_time))
            return res
        return wrapper
    
    @timmer #test=timmer(test)  timmer执行后会返回wrapper地址赋值给test
    def test():
        time.sleep(3)
        print('test函数运行完毕')
        return '这是test的返回值'
    
    res2 = test()
    print (res2)
    
    输出:
    test函数运行完毕
    运行时间是3.0001718997955322
    这是test的返回值
      4.加上参数的装饰器
    import time
    def timmer(func): #func=test1
        def wrapper(*args,**kwargs): #test('linhaifeng',age=18)  args=('linhaifeng')  kwargs={'age':18}
            start_time=time.time()
            res=func(*args,**kwargs) #就是在运行test()    func(*('linhaifeng'),**{'age':18})
            stop_time = time.time()
            print('运行时间是%s' %(stop_time-start_time))
            return res
        return wrapper
    
    # @timmer #test=timmer(test)
    def test(name,age):
        time.sleep(3)
        print('test函数运行完毕,名字是【%s】 年龄是【%s】' %(name,age))
        return '这是test的返回值'
    
    @timmer
    def test1(name,age,gender):
        time.sleep(1)
        print('test1函数运行完毕,名字是【%s】 年龄是【%s】 性别【%s】' %(name,age,gender))
        return '这是test的返回值'
    
    # res=test('linhaifeng',age=18)  #就是在运行wrapper
    # # print(res)
    # test1('alex',18,'male')
    
    test1('alex',18,'male')
      5.带参数的装饰器
     1 user_list=[
     2     {'name':'alex','passwd':'123'},
     3     {'name':'linhaifeng','passwd':'123'},
     4     {'name':'wupeiqi','passwd':'123'},
     5     {'name':'yuanhao','passwd':'123'},
     6 ]
     7 current_dic={'username':None,'login':False}
     8 
     9 def auth(auth_type='filedb'):
    10     def auth_func(func):
    11         def wrapper(*args,**kwargs):
    12             print('认证类型是',auth_type)
    13             if auth_type == 'filedb':
    14                 if current_dic['username'] and current_dic['login']:
    15                     res = func(*args, **kwargs)
    16                     return res
    17                 username=input('用户名:').strip()
    18                 passwd=input('密码:').strip()
    19                 for user_dic in user_list:
    20                     if username == user_dic['name'] and passwd == user_dic['passwd']:
    21                         current_dic['username']=username
    22                         current_dic['login']=True
    23                         res = func(*args, **kwargs)
    24                         return res
    25                 else:
    26                     print('用户名或者密码错误')
    27             elif auth_type == 'ldap':
    28                 print('鬼才特么会玩')
    29                 res = func(*args, **kwargs)
    30                 return res
    31             else:
    32                 print('鬼才知道你用的什么认证方式')
    33                 res = func(*args, **kwargs)
    34                 return res
    35 
    36         return wrapper
    37     return auth_func
    38 
    39 @auth(auth_type='filedb') #auth_func=auth(auth_type='filedb')-->@auth_func 附加了一个auth_type  --->index=auth_func(index)
    40 def index():
    41     print('欢迎来到京东主页')
    42 
    43 @auth(auth_type='ldap')
    44 def home(name):
    45     print('欢迎回家%s' %name)
    46 #
    47 @auth(auth_type='sssssss')
    48 def shopping_car(name):
    49     print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃'))
    50 
    51 # print('before-->',current_dic)
    52 # index()
    53 # print('after--->',current_dic)
    54 # home('产品经理')
    55 shopping_car('产品经理')
    def auth(n):
        def myfunc(func):
            def wrapper(*args,**kwargs):
                if n=='1':
                    return func(*args,**kwargs)
                else:
                    print('can shu bu cun zai')
            return wrapper
        return myfunc
    @auth('1')
    def index():
        print('欢迎来到京东主页')
    
    index()
    支持参数的装饰器
  • 相关阅读:
    js检验文件格式
    java判空工具类
    $(document).ready() 是个什么函数?为什么要用它?
    Maven 手动添加jar
    java深克隆
    cors跨域详解
    常见异常类总结
    Spring事务回滚机制
    Java获取13位毫秒级时间戳
    JSON 字符串转换为 Map
  • 原文地址:https://www.cnblogs.com/guotianbao/p/6809645.html
Copyright © 2020-2023  润新知