zoukankan      html  css  js  c++  java
  • Python入门学习-DAY11-装饰器

    装饰器介绍与简单实现

    1. 什么是装饰器
    器:指的是具备某一功能的工具
    装饰:指的是为被装饰器对象添加新功能

    装饰器就是用来为被装饰器对象添加新功能的工具
    注意:装饰器本身可以是任意可调用对象,被装饰器的对象也可以是任意可调用对象


    2. 为何要用装饰器
    开放封闭原则:封闭指的是对修改封闭,对扩展开放

    装饰器的实现必须遵循两大原则:
    1. 不修改被装饰对象的源代码
    2. 不修改被装饰器对象的调用方式

    装饰器的目标:就是在遵循1和2原则的前提下为被装饰对象添加上新功能

    3. 怎么用装饰器
    '''
    import time

    def index():
    print('welcome to index page')
    time.sleep(3)

    def outter(func): # func=最原始那个index的内存地址
    def wrapper():
    start=time.time()
    func() #最原始的那个index的内存地址()
    stop=time.time()
    print('run time is %s' %(stop - start))
    return wrapper

    index=outter(index) #index=outter(最原始那个index的内存地址) #index=wrapper的内存地址
    index() #wrapper的内存地址()



    深入学习
    import time

    def index():
    print('welcome to index page')
    time.sleep(3)

    def home(name):
    print('welcome %s to home page' %name)
    time.sleep(2)
    return 123

    def timmer(func): #func=最原始那个home函数的内地址
    def wrapper(*args,**kwargs): #args=('egon',) kwargs={}
    start=time.time()
    res=func(*args,**kwargs) #最原始那个home函数的内地址('egon')
    stop=time.time()
    print('run time is %s' %(stop - start))
    return res
    return wrapper

    # index=timmer(index)
    index()

    home=timmer(home) #home=outter(最原始那个home函数的内地址) #home=wrapper函数的内地址

    res=home('egon') # res=wrapper函数的内地址('egon')
    print(res)
    装饰器的语法糖
    # 装饰器的语法糖:在被装饰对象正上方单独一行写@装饰器的名字
    # 运行原理:
    # python解释器一旦运行到@装饰器的名字,就会调用装饰器,然后将被装饰函数的内存地址当作参数
    #传给装饰器,最后将装饰器调用的结果赋值给原函数名

    # import time
    #
    # def timmer(func): #func=最原始那个home函数的内地址
    # def wrapper(*args,**kwargs): #args=('egon',) kwargs={}
    # start=time.time()
    # res=func(*args,**kwargs) #最原始那个home函数的内地址('egon')
    # stop=time.time()
    # print('run time is %s' %(stop - start))
    # return res
    # return wrapper
    #
    # @timmer #index=timmer(index)
    # def index():
    # print('welcome to index page')
    # time.sleep(3)
    #
    # @timmer #home=timmer(home)
    # def home(name):
    # print('welcome %s to home page' %name)
    # time.sleep(2)
    # return 123
    #
    # index()
    # res=home('egon') # res=wrapper函数的内地址('egon')
    # print(res)
    #
    #



    import time

    # 装饰器模板
    def outter(func):
    def wrapper(*args,**kwargs):
    #在调用函数前加功能
    res=func(*args,**kwargs) #调用被装饰的也就是最原始的那个函数
    #在调用函数后加功能
    return res
    return wrapper

    @outter #index=outter(index) #index=wrapper
    def index():
    print('welcome to index page')
    time.sleep(3)

    index()


    叠加多个装饰器

    '''
    import time

    def timmer(func): #func=wrapper2
    def wrapper1(*args,**kwargs):
    start=time.time()
    res=func(*args,**kwargs) #res=wrapper2(*args,**kwargs)
    stop=time.time()
    print('run time is %s' %(stop - start))
    return res
    return wrapper1

    def auth(func): #func=最原始的那个index的内存地址
    def wrapper2(*args,**kwargs):
    inp_user = input('please input your username: ').strip()
    inp_pwd = input('please input your password: ').strip()
    if inp_user == 'egon' and inp_pwd == '123':
    print('login successfull')
    res=func(*args,**kwargs) # 调用最原始的那个/也就是被装饰的那个函数
    return res
    else:
    print('username or password error')
    return wrapper2

    # 解释@语法的时候是自下而上运行
    # 而执行装饰器内的那个wrapper函数时的是自上而下
    @timmer # index=timmer(wrapper2) #index=wrapper1
    @auth # index=auth(最原始的那个index的内存地址) #index=wrapper2
    def index():
    print('welcome to index page')
    time.sleep(3)

    index() #wrapper1()

    '''



    # import time
    #
    # def timmer(func):
    # print('timmer')
    # def wrapper1(*args,**kwargs):
    # start=time.time()
    # res=func(*args,**kwargs) #res=wrapper2(*args,**kwargs)
    # stop=time.time()
    # print('run time is %s' %(stop - start))
    # return res
    # return wrapper1
    #
    # def auth(func):
    # print('auth')
    # def wrapper2(*args,**kwargs):
    # inp_user = input('please input your username: ').strip()
    # inp_pwd = input('please input your password: ').strip()
    # if inp_user == 'egon' and inp_pwd == '123':
    # print('login successfull')
    # res=func(*args,**kwargs) # 调用最原始的那个/也就是被装饰的那个函数
    # return res
    # else:
    # print('username or password error')
    # return wrapper2
    #
    #
    # @auth # index=auth(wrapper1) #index=wrapper2
    # @timmer #timmer(最原始的index)返回wrapper1
    # def index():
    # print('welcome to index page')
    # time.sleep(3)
    #
    # index() #wrapper2()
    #




    import time



    def outter1(func1): #func1=wrapper2
    print('outter1')
    def wrapper1(*args,**kwargs):
    print('wrapper1')
    res1=func1(*args,**kwargs) #res1=wrapper2(*args,**kwargs)
    return res1
    return wrapper1

    def outter2(func2): #func2=最原始的那个index的内存地址
    print('outter2')
    def wrapper2(*args,**kwargs):
    print('wrapper2')
    res2=func2(*args,**kwargs)
    return res2
    return wrapper2


    @outter1 # index=outter1(wrapper2) #index=wrapper1
    @outter2 #outter2(最原始的那个index的内存地址) ===> wrapper2
    def index():
    print('welcome to index page')
    time.sleep(3)

    index() #wrapper1()

    '''
    outter2
    outter1
    wrapper1
    wrapper2

    '''

    有参装饰器
    import time

    current_user={'username':None}

    # 补充:所有的数据类型的值自带布尔值,可以直接当作条件去用,只需要记住布尔值为假的那一些值即可(0,空,None)


    def login(engine='file'): #engine='mysql'
    def auth(func): #func=最原始那个index的内存地址
    def wrapper(*args,**kwargs):
    if current_user['username']:
    print('已经登录过了,无需再次登陆')
    res=func(*args,**kwargs)
    return res

    if engine == 'file':
    inp_user = input('please input your username: ').strip()
    inp_pwd = input('please input your password: ').strip()
    if inp_user == 'egon' and inp_pwd == '123':
    print('login successfull')
    current_user['username']=inp_user # 在登陆成功之后立刻记录登录状态
    res=func(*args,**kwargs) # res=最原始那个index的内存地址(*args,**kwargs)
    return res
    else:
    print('username or password error')
    elif engine == 'mysql':
    print('基于mysql的认证机制')
    elif engine == 'ldap':
    print('基于ldap的认证机制')
    else:
    print('无法识别的认证源')
    return wrapper
    return auth

    @login('file') #@auth # index=auth(最原始那个index的内存地址) #index=wrapper
    def index():
    print('welcome to index page')
    time.sleep(3)

    @login('file')
    def home(name):
    print('welcome %s to home page' %name)
    time.sleep(2)
    return 123


    index() #wrapper()
    res=home('egon')
    print(res)



    # 有参装饰器的模板
    def outter1(x,y,z):
    def outter2(func):
    def wrapper(*args,**kwargs):
    res=func(*args,**kwargs)
    return res
    return wrapper
    return outter2

    # 无参装饰器的模板
    def outter(func):
    def wrapper(*args,**kwargs):
    res=func(*args,**kwargs)
    return res
    return wrapper

     
     
     
  • 相关阅读:
    201521044091《Java程序设计》第7周学习总结
    201521044091《java程序设计》第四次总结
    201521044091 《java程序设计》第八周学习总结
    201521044091 《Java程序设计》第5周学习总结
    201521044091 《Java程序设计》第2周学习总结
    201521044091 《Java程序设计》第3周学习总结
    MySQL设置字符集CHARACTER SET
    Create My MySQL configuration by Percona
    How to use jQuery to manipulate Cookies
    How to use OpenXml to import xml data to Sql server
  • 原文地址:https://www.cnblogs.com/xvchengqi/p/9403742.html
Copyright © 2011-2022 走看看