zoukankan      html  css  js  c++  java
  • 3/29 函数 装饰器

    1 装饰器 

    定义 开放封闭原则,软件一旦上线后,就应该遵循开放封闭的原则,即对修改源代码是封闭的,对功能的扩展是开放的。

    也就是说我们必须找到一种解决方案:

    能够在不修改原有代码的基础上,为其添加新功能。

      总结

    原则如下:

    1 .不修改源代码

    2.不修改调用方式

    目的:

    在遵循1和2 原则的基础上扩展新功能。

    2 什么是装饰器?

    器指的是工具,装饰指的是为被装饰对象添加新功能

    完整含义:

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

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

    装饰器=》函数

    被装饰的对象=》函数

    import time

    第一种

    def index()

      start_time=time.time()

      time.sleep(3)

      print('wclome,to index page')

      stop_time=time.time()

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

    第二种

    index()

    def index():

      time.sleep(3)

      print('xxxxxx')

    def home (name):

      time.sleep(5)

      print('asdadas')

    def wrapper(func): #func=index
    start_time=time.time()
    func() #index()
    stop_time = time.time()
    print('run time is %s' % (stop_time - start_time))
    第三种
    import time

    def 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

    index() #wrapper()

    无参升级版


    #==============装饰器
    def timmer(func):
    #func=最原始的home
    def wrapper(*args,**kwargs):
    start_time=time.time()
    res=func(*args,**kwargs) #调用最原始的home
    stop_time=time.time()
    print(stop_time-start_time)
    return res
    return wrapper

    装饰器语法糖
    装饰器的正下方可以使用@来直接定义
    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)

    有参数的装饰器

    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

    @auth('ldap') #@auth2 #index=auth2(index) #index=wrapper
    def index():
    time.sleep(1)
    print('welcome to index page')
    return 122

      

  • 相关阅读:
    [译]Java例解Interface
    【笔记】2014-01至2014-02
    【笔记】2013-12
    【笔记】2013-10至2013-11
    【笔记】2013-09
    【笔记】2013-08
    【笔记】2013-07
    生活工作中好用的快捷键和小工具(更新)
    Android Studio更新Gradle问题
    gradle构建spring5源码
  • 原文地址:https://www.cnblogs.com/seanliang/p/8670114.html
Copyright © 2011-2022 走看看