天天看點

十二、裝飾器進階

執行函數的時候* 打散

定義函數的時候* 聚合

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  # func1 = wrapper(func1)  func1 = inner
def func1(*args): #args (1,2,3)
    print(666)
    return args
print(func1(*[1,2,3]))  # inner(1,3,5) 打散

列印函數有用資訊
      
@wrapper
def func1():
    """
    此函數是完成登陸的功能,參數分别是...作用。
    :return: 傳回值是登陸成功與否(True,False)
    """
    print(666)
    return True
func1()
print(func1.__name__)
print(func1.__doc__)
      

#666

 func1

 此函數是完成登陸的功能,參數分别是...作用。

: return: 傳回值是登陸成功與否(True,False)

帶參數的裝飾器

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 = False
@timmer(flag,2,3)  # 兩步:1,timmer(flag) --> wrapper 2,@wrapper 裝飾器
def func1():
    print(666)


@timmer(flag)
def func2():
    print(777)
func1()
func2()      
多個裝飾器裝飾一個函數
      
def wrapper1(func): f = func
    def inner1():
        print('wrapper1 ,before func')
        func()
        print('wrapper1 ,after func')
    return inner1

def wrapper2(func):  func = inner1
    def inner2():
        print('wrapper2 ,before func')
        func()
        print('wrapper2 ,after func')
    return inner2

@wrapper2   然後讀@wrapper2   f = inner2   
@wrapper1   先讀@wrapp1      f = inner1
def f():
    print('in f')

f()        再讀f()      

繼續閱讀