zoukankan      html  css  js  c++  java
  • python 之 函数 装饰器

    5.8 装饰器

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

    装饰器: 装饰器即在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能,装饰器与被装饰的对象均可以是任意可调用的对象

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

    5.81 无参装饰器举例

    import time
    def index():
        time.sleep(3)
        print('welcome to index page')
    def outter(func): #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()
    welcome to index page
    3.0000429153442383

    5.82 无参装饰器升级

    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=最原始的index
        def wrapper(*args,**kwargs):
            start_time=time.time()
            res=func(*args,**kwargs) #调用最原始的index
            stop_time=time.time()
            print(stop_time-start_time)
            return res
        return wrapper
    ​
    index=timmer(index) # 新的index=wrapper
    home=timmer(home) #新的home=wrapper
    # ==========================================
    ​
    res=index()             #res=wrapper()
    print(res)
    res=home(name='egon')   #res=wrapper(name='egon')
    print(res)

    5.83 无参装饰器模板:

    def index():
        pass
    #==============装饰器
    def outer(func):
        def inner(*args,**kwargs):
            res=func(*args,**kwargs)
            return res
        return inner
    ​
    index=outer(index)  
    # ==========================================
    res=index()             
    print(res)

    使用:在被装饰对象正上方单独一行,@无参装饰器名

    @无参装饰器名
    def foo():
        pass

    5.84 装饰器语法糖

    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')

    5.85 叠加装饰器

    import time
    current_user={
        'username':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()

    5.86 有参装饰器

    import time
    current_user={
        'username':None
    }
    def auth(engine):        # engine='file'    #添加一层函数传engine值
        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_src=auth('ldap')
    #@auth_src
    ​
    @auth('ldap')       # @auth2 #index=auth2(index) #index=wrapper
    def index():
        time.sleep(1)
        print('welcome to index page')
        return 122
    ​
    index()             # wrapper()

    5.87 有参装饰器模板

    def outter2(x,y,z):
        def outter(func):
            def wrapper(*args,**kwargs):
                res=func(*args,**kwargs)
                return res
            return wrapper
        return outter
    @outer2(1,2,3)
    # ==========================================
    def index():
        pass
    res=index()             
    print(res)
    使用:在被装饰对象正上方单独一行,@有参装饰器名(1,2,3)
    
    @有参装饰器名(1,2,3)
    def foo():
        pass
  • 相关阅读:
    vue 图片切换动态绑定
    弹窗居中,不会随页面滚动变化,直接固定在屏幕中央
    GC优化策略官篇2
    UI优化策略网格重建
    GC优化策略官篇1
    Graphics优化策略官篇3
    GC优化策略官篇3
    Scripts优化策略官篇2
    UI优化策略高级技巧
    Scripts优化策略官篇1
  • 原文地址:https://www.cnblogs.com/mylu/p/11006349.html
Copyright © 2011-2022 走看看