zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    Fix Installing .NET Framework 3.5 failed Error Code 0x800F0954 on Windows 10
    RHEL8安装五笔输入法
    Enable EPEL and Local Repository on RHEL8
    Why is Yum Replaced by DNF?
    检查Linux服务器是否被攻击的常用命令及方法
    IDEA 主题
    IDEA 如何显示一个类中所有的方法
    Appium 安装以及安装过程中遇到的问题
    Maven 如何发布 jar 包到 Nexus 私库
    java泛型的基本使用
  • 原文地址:https://www.cnblogs.com/yangli0504/p/8669929.html
Copyright © 2011-2022 走看看