zoukankan      html  css  js  c++  java
  • Day4_装饰器

    装饰器:

    #模板
    def auth(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return res return wrapper

    #遵循开放封闭原则:对扩展是开放的,对修改是封闭的。

    #装饰器本身可以可以是任意可调用的对象,被装饰的对象本身也可以是任意可以调用的对象。

    #装饰器遵循的原则:

      1,不修改被装饰对象的源代码

      2,不修改被调用对象的调用方法

    #装饰器的目的:

      在遵循1和2的原则的前提下,为其他函数添加新功能

    #定义了一个函数,想在原函数的基础上增加一个统计函数运行时间的功能
    import time
    def index():
        print('Welcome to index')
    index()
    
    #首先用这个解决方式,这种方式不满足装饰器不改变原函数的规则
    def wrapper(func):
        start=time.time()
        func()
        stop=time.time()
        print('run time is %s' %(stop-start))
    wrapper(index)
    

     利用下面这种方法,可以解决问题:

    import time
    def index():
        time.sleep(3)
        print('Welcome to index')
    
    def timmer():
        func=index
        def wrapper():
            start=time.time()
            func()
            stop=time.time()
            print('run time is %s' %(stop-start))
        return wrapper
    
    index=timmer()
    
    index()
    

     但是如果说想要添加多个功能的时候,我们需要将func=index这行注释:

    import time
    def index():
        time.sleep(3)
        print('Welcome to index')
    
    def home():
        time.sleep(3)
        print('Welcome to home')
    
    def timmer():
        #func=index
        def wrapper():
            start=time.time()
            func()
            stop=time.time()
            print('run time is %s' %(stop-start))
        return wrapper
    
    index=timmer(index)
    home=timmer(home)
    index()
    

    我们可以将index=timmer(index)     home=timmer(home)简写

    #装饰器必须要写到被装饰器的正上方,并且单独一行
    def timmer():
        #func=index
        def wrapper():
            start=time.time()
            func()
            stop=time.time()
            print('run time is %s' %(stop-start))
        return wrapper
    
    #index=timmer(index)
    #home=timmer(home)
    @timmer
    import time
    def index():
        time.sleep(3)
        print('Welcome to index')
    
    @timmer
    def home():
        time.sleep(3)
        print('Welcome to home')
    
    
    index()
    

    被装饰对象是有参函数:

    要让装饰器的函数能够适应各种有参,无参,多参的函数。

    我们可以再装饰其中加入(*args,**kwargs)

    def timmer():
        #func=index
        def wrapper(*args,**kwargs):
            start=time.time()
            res=func(*args,**kwargs)
            stop=time.time()
            print('run time is %s' %(stop-start))
         return res return wrapper #index=timmer(index) #home=timmer(home) @timmer import time def index(): time.sleep(3) print('Welcome to index')
      return 123 @timmer def home(): time.sleep(3) print('Welcome to home')
    #如果函数里边有返回值,例如我们在index()函数中有返回值,我们需要在上面的装饰器里边在定义一层,
    res=func(),在结尾返回一个return res index()

    实现认证功能的装饰器:

    def auth(func):
        def wrapper(*args,**kwargs):
            name=input('input your name').strip()
            password=input('input your password').strip()
            if name == 'yangshuai' and password == '123':
                res=func(*args,**kwargs)
                return res
            else:
                print('login failed')
        return wrapper
    
    @auth
    def index():
        print("login successful")
    
    index()
    

    6-15:11

  • 相关阅读:
    lanya
    Apple watch ,小米微信通知
    jenkins grunt 自动构建流程
    刷机步骤
    ipad忘记了锁屏密码,已经越狱了
    ar
    如何在ubuntu中安装php
    阿里云
    docker swarm 集群及可视化界面的安装及配置
    https://github.com/gaoyangxiaozhu/DockerVI
  • 原文地址:https://www.cnblogs.com/sexiaoshuai/p/7250079.html
Copyright © 2011-2022 走看看