• Python之旅.第三章.函数


    一、无参装饰器

    1 开放封闭原则
    软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的
    也就是说我们必须找到一种解决方案:
    能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能

    总结,
    原则如下:
    1、不修改源代码
    2、不修改调用方式
    目的:
    在遵循1和2原则的基础上扩展新功能

    2、什么是装饰器?
    器指的工具,装饰指的是为被装饰对象添加新功能

    完整含义:
    装饰器即在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能

    装饰器与被装饰的对象均可以是任意可调用的对象

    装饰器=》函数
    被装饰的对象=》函数

    '''

    import time #调用时间方法

    def index():
    start_time=time.time() #设定开始时间
    time.sleep(3) #暂停3秒
    print('welcome to index page')
    stop_time=time.time()  #设定结束时间
    print('run time is %s' %(stop_time-start_time)) #开始时间减结束时间,等于用的时间

    index()


    #修订1:
    import time

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

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

    start_time=time.time()    #将时间操作单独拿出使用
    index()
    stop_time = time.time()
    print('run time is %s' % (stop_time - start_time))

    start_time=time.time()
    home('egon')
    stop_time = time.time()
    print('run time is %s' % (stop_time - start_time))


    #修订2:
    import time

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

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

    def wrapper(func): #func=index #把时间操作放到函数中
    start_time=time.time()
    func() #index()
    stop_time = time.time()
    print('run time is %s' % (stop_time - start_time))


    wrapper(index) # 修改了原函数的调用方式



    #修订3:
    import time

    def index(): #原index函数
    time.sleep(3)
    print('welcome to index page')

    def outter(func): #func=最原始的index #闭合函数,外包
    # func=最原始的index
    def wrapper(): #嵌套定义的函数
    start_time=time.time()
    func()
    stop_time=time.time()
    print(stop_time-start_time)
    return wrapper


    index=outter(index) # 新的index=wrapper #将返回值wrapper赋予index

    index() #wrapper() #等于weapper函数

    二、无参装饰器升级版

    import time

    def index():
    time.sleep(1)
    print('welcome to index page')
    return 122

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

    #==============装饰器
    def timmer(func): #外包
    #func=最原始的home
    def wrapper(*args,**kwargs): #嵌套函数,赋予形参*args,**kwargs,用于解决调用函数自带参数问题
    start_time=time.time()
    res=func(*args,**kwargs) #调用最原始的home,将值赋予res留返回
    stop_time=time.time()
    print(stop_time-start_time)
    return res #对应带返回值的函数处理
    return wrapper


    index=timmer(index) # 新的index=wrapper
    home=timmer(home) #新的home=wrapper
    # ==========================================

    home(name='egon') #wrapper('egon')
    index() #wrapper()


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

    三、装饰器语法

    关键字@,@后面跟装饰器函数名,正下面为需要用到装饰器的函数,@必须单独一行

    import time
    def timmer(func):
    def wrapper(*args,**kwargs):
    start_time=time.time()
    res=func(*args,**kwargs)
    stop_time=time.time()
    print(stop_time-start_time)
    return res
    return wrapper

    @timmer #index=timmer(index)
    def index():
    time.sleep(1)
    print('welcome to index page')
    return 122

    @timmer # home=timmer(home)
    def home(name):
    time.sleep(2)
    print('welcome %s to home page' %name)

    # index()
    home('egon')

    四、叠加多个装饰器

    import time
    current_user={ #字典用于存用户名
    'username':None,
    # 'login_time':None
    }

    def auth(func): #注册装饰器
    # func=index
    def wrapper(*args,**kwargs):
    if current_user['username']:
    print('已经登陆过了')
    res=func(*args,**kwargs)
    return res

    uname=input('用户名>>: ').strip()
    pwd=input('密码>>: ').strip()
    if uname == 'egon' and pwd == '123':
    print('登陆成功')
    current_user['username']=uname
    res=func(*args,**kwargs)
    return res
    else:
    print('用户名或密码错误')
    return wrapper

    def timmer(func): #时间装饰器
    def wrapper(*args,**kwargs):
    start_time=time.time()
    res=func(*args,**kwargs)
    stop_time=time.time()
    print(stop_time-start_time)
    return res
    return wrapper

    @timmer # timmer 统计的是auth+index的执行时间
    @auth
    def index():
    time.sleep(1)
    print('welcome to index page')
    return 122

    index()

    两种装饰器叠加使用(红字),timmer为下只统计index的运行时间,放上面统计的是auth+index的执行时间

    五、有参数装饰器

    import time
    current_user={
    'username':None,
    # 'login_time':None
    }

    def auth(engine): #再在外面定义一个有参函数用于传值,三层装饰器
    # engine='file'
    def auth2(func): #第二层包第一层
    # func=index
    def wrapper(*args,**kwargs): #第一层
    if engine == 'file':
    if current_user['username']:
    print('已经登陆过了')
    res=func(*args,**kwargs)
    return res

    uname=input('用户名>>: ').strip()
    pwd=input('密码>>: ').strip()
    if uname == 'egon' and pwd == '123':
    print('登陆成功')
    current_user['username']=uname
    res=func(*args,**kwargs)
    return res
    else:
    print('用户名或密码错误')
    elif engine == 'mysql':
    print('基于MyQL的认证')
    elif engine == 'ldap':
    print('基于LDAP的认证')
    return wrapper
    return auth2 #返回值为auth2
    #用法 @第三层函数名加参数,因为执行到这段代码会运行,返回值为auth2,也就等于执行的是@auth2,成功赋值index
    @auth('ldap') #@auth2 #index=auth2(index) #index=wrapper
    def index():
    time.sleep(1)
    print('welcome to index page')
    return 122

    index() # wrapper()
  • 相关阅读:
    Spring Cloud云架构
    Spring Cloud云架构
    Spring Cloud云架构
    Spring Cloud云架构
    Spring Cloud Consul
    Spring Cloud Eureka
    构建Spring Cloud微服务分布式云架构
    数据库三范式
    redis3.0.0 集群安装详细步骤
    sql优化的几种方法
  • 原文地址:https://www.cnblogs.com/yangli0504/p/8669929.html
Copyright © 2020-2023  润新知