12python(第十二天日记)

装饰器

  1.函数的有用信息


def
wrapper(f): # f = func1 def inner(*args,**kwargs): #聚合 #args (1,2,3) '''执行函数之前的相关操作''' ret = f(*args,**kwargs) # 打散 1,2,3 '''执行函数之后的相关操作''' return ret return inner @wrapper def func1(): """ 此函数是完成登陆的功能,参数分别是...作用。 :return: 返回值是登陆成功与否(True,False) """ print(666) return True func1() print(func1.__name__) print(func1.__doc__)
>>>666
>>>inner
>>>执行函数之前的相关操作 #因为此装饰器无法打印出完整装饰器执行操作,所以看下图----->正确打开方式:



from functools import wraps   #新加
def wrapper(f):  # f = func1
    @wraps(f)                 #新加
    def inner(*args,**kwargs): #聚合
        #args (1,2,3)
        '''执行函数之前的相关操作'''
        ret = f(*args,**kwargs)  # 打散 1,2,3
        '''执行函数之后的相关操作'''
        return ret
    return inner
@wrapper
def func1():
    """
    此函数是完成登陆的功能,参数分别是...作用。
    :return: 返回值是登陆成功与否(True,False)
    """
    print(666)
    return True
func1()
print(func1.__name__)
print(func1.__doc__)
>>>666
>>>func1
>>>    
      此函数是完成登陆的功能,参数分别是...作用。
       :return: 返回值是登陆成功与否(True,False)

 

 

  2.带参数的装饰器

import time
def timmer(*args,**kwargs):
    def wrapper(f):
        def inner(*args,**kwargs):
            if flag:
                start_time = time.time()
                ret = f(*args,**kwargs)
                time.sleep(0.3)
                end_time = time.time()
                print('此函数的执行效率%f' % (end_time-start_time))
            else:
                ret = f(*args, **kwargs)
            return ret
        return inner
    return wrapper

flag = True
@timmer(flag,2,3)  # 两步:1,timmer(flag) --> wrapper 2,@wrapper 装饰器
def func1():
    print(666)

@timmer(flag)
def func2():
    print(777)
func1()
func2()
>>>666
>>>此函数的执行效率0.300135
>>>777
>>>此函数的执行效率0.300409

 

  3.多个装饰器装饰一个函数

def wrapper1(func):  # func ==  f函数名
    def inner1():
        print('wrapper1 ,before func')  # 2
        func()
        print('wrapper1 ,after func')  # 4
    return inner1

def wrapper2(func):  # func == inner1
    def inner2():
        print('wrapper2 ,before func')  # 1
        func()
        print('wrapper2 ,after func')  # 5
    return inner2
@wrapper2  #  f = wrapper2(f)  里面的f==inner1  外面的f == inner2
@wrapper1  # f = wrapper1(f)   里面的f==函数名f  外面的f == inner1
def f():  # 3
    print('in f')


 

posted on 2018-04-02 11:55  小鸡刨粑粑  阅读(97)  评论(0编辑  收藏  举报

导航