Python 装饰器

发布时间:2019-08-13 07:41:24编辑:auto阅读(37)

    第1章 装饰器

    1.1什么是装饰器?

    装饰器就是用来为被装饰对象新增功能的工具/函数

    1.2装饰器原则:

    1.     不修改被装饰对象的源代码

    2.     不修改被装饰对象的调用方式

    1.3装饰器的目标:为被装饰对象加上新功能

    import time

    def index():
        time.sleep(
    1)
        
    print('index page')

    def outter(func):
        
    defwrapper():
            start=time.time()
            func()
            stop=time.time()
            
    print(stop - start)
        
    returnwrapper
    index=outter(index)
    index()

    第2章 装饰器语法糖:

    在被装饰器对象正上方单独一行写:@装饰器的名字

    import time

    def outter(func):
        
    defwrapper():
            start=time.time()
            func()
            stop=time.time()
            
    print(stop - start)
        
    returnwrapper

    @
    outter #index=outter(index)
    def index():
        time.sleep(
    1)
        
    print('index page')

    index()

    2.1 装饰器修订:让装饰器可以装饰有参和无参函数

    import time

    def outter(func):
        
    defwrapper(*args,**kwargs):
            start=time.time()
            res=func(*args
    ,**kwargs)
            stop=time.time()
            
    print(stop - start)

           return res
        
    returnwrapper

    @
    outter #index=outter(index)
    def index():
        time.sleep(
    1)
        
    print('index page')

    @
    outter
    def home(name):
        time.sleep(
    1)
        
    print('home index')

    index()
    home(
    'jiang')

    2.2练习:在通过认证后,才能运行相关功能

    import time

    def outter(func):
        
    defwrapper(*args,**kwargs):
            start=time.time()
            func(*args
    ,**kwargs)
            stop=time.time()
            
    print(stop - start)
        
    returnwrapper

    def auth(func):
        
    defwrapper(*args**kwargs):
            name=
    input('请输入用户名:').strip()
            passwd=
    input('请输入密码:').strip()
            
    ifname == 'jiang'and passwd == '123':
                res=func(*args
    **kwargs)
                
    returnres
            
    else:
                
    print('认证失败')
        
    returnwrapper

    @
    auth
    @outter #index=outter(index)
    def index():
        time.sleep(
    1)
        
    print('index page')

    @
    outter
    def home(name):
        time.sleep(
    1)
        
    print('home index')

    index()

    第3章 叠加装饰器

    加载顺序:自下而上

    执行顺序:自上而下

    import time

    current_user={
    'username':None}

    def timmer(func):
        
    defwrapper(*args,**kwargs):
            start=time.time()
            res=func(*args
    ,**kwargs)
            stop=time.time()
            
    print(stop-start)
            
    returnres
        
    returnwrapper

    def auth(func):
        
    defwrapper(*args,**kwargs):
            
    ifcurrent_user['username']:
                res=func(*args
    ,**kwargs)
                
    returnres
            name=
    input('username>>: ').strip()
            passwd=
    input('password>>: ').strip()
            
    ifname == 'jiang'and passwd == '123':
                current_user[
    'username']=name
                res=func(*args
    ,**kwargs)
                
    returnres
            
    print('用户名或者密码错误')
        
    returnwrapper
    @
    timmer
    @auth
    def index():
        
    print('from index')
    @
    auth
    def home():
        
    print('from home')

    index()
    home()

    第4章 有参装饰器:

    import time

    current_user={
    'username':None}

    def outter(engine):
        
    defauth(func):
            
    defwrapper(*args,**kwargs):
                
    ifcurrent_user['username']:
                    res=func(*args
    ,**kwargs)
                    
    return res
                name=
    input('username>>: ').strip()
                passwd=
    input('password>>: ').strip()
                
    ifengine == 'mysql':
                    
    if name == 'jiang'and passwd == '123':
                        current_user[
    'username']=name
                        
    print('基于mysql的认证')
                        res=func(*args
    ,**kwargs)
                        
    return res
                    
    else:
                        
    print('用户名或者密码不正确')
                
    elifengine == "ldap":
                    
    print('基于ldap 的认证')
                
    else:
                    
    print('基于文件的认证')
            
    returnwrapper
        
    returnauth

    @
    outter(engine='mysql')
    def index():
        
    print('from index')

    @
    outter(engine='ldap')
    def home():
        
    print('from home')

    index()
    home()

     

    第5章 无参装饰器

    import time
    def timmer(func):
        
    defwrapper(*args,**kwargs):
            start_time=time.time()

            res=func(*args
    ,**kwargs)
            stop_time=time.time()

            
    print('run time is %s' %(stop_time-start_time))
            
    returnres    
        
    returnwrapper

    @timmer
    def foo():    
        time.sleep(
    1)    
        
    print('from foo')foo()


关键字