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

 

posted @ 2017-07-28 14:32  sexiaoshuai  阅读(108)  评论(0编辑  收藏  举报