python 3層裝飾器及應用場景

#!/usr/bin/env pythonpython

# -*- coding:utf-8 -*-微信

# author: Changhua Gongapp

import time, functoolside


'''函數

實現裝飾器:測試

1.函數即變量;utf-8

2.高階函數;it

    1)把一個函數名當作實參傳給另外一個函數(在不修改被裝飾函數的源代碼狀況下爲其添加功能);io

    2)返回值中,包含函數名(不修改函數的調用方試)。class

3.嵌套函數(在一個函數中,用def去聲明另外一個函數)。

原則:

1.不能修改被裝飾的函數的源代碼;

2.不能修改被裝飾的函數的調用方試。

補:

1.函數在調用前,只要其涉及到的變量均在調用前別解釋徹底(不管前後順序)

  便可順利執行。


'''



def timmer(func):

    # @functools.wraps(func)  #加上這個裝飾後test的函數名就不是wrapper了,而是test,注意位置(http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000)

    def wrapper(*args, **kv):

        time_b = time.time()

        return (func(*args, **kv))

        time_e = time.time()

        print("Function %s runned for %ss" % (func.__name__, (time_e - time_b)))


    return wrapper  # 注意這個return的位置



# 寫在裝飾的函數的前面,裝飾多個函數,每一個函數前面需加上@decorator

@timmer  # test = timmer(test) = wrapper, 調用時test() = wrapper(),這裏說明參數的傳輸問題

# test(*args,**kv) = wrapper(*args,**kv)

def test():

    print("Function test begins running.")

    time.sleep(0.2)

    print("Function test ends running.")

    return "測試"


print("經過2層裝飾器函數名更替爲:%s" % test.__name__)

print(test())

print("-----------------------------------------")



def timmer(func):

    #@functools.wraps(func)

    def wrapper(*args, **kv):

        time_b = time.time()

        print("Begin calling.")

        rs = func(*args, **kv)  # 將函數返回值賦給rs

        print("End calling.")

        return rs  # 這裏返回函數執行完後的返回值

        time_e = time.time()

        print("Function %s runned for %ss" % (func.__name__, (time_e - time_b)))


    return wrapper  # 注意這個return的位置



# 寫在裝飾的函數的前面,裝飾多個函數,每一個函數前面需加上@decorator

@timmer  # test = timmer(test) = wrapper, 調用時test() = wrapper(),這裏說明參數的傳輸問題

# test(*args,**kv) = wrapper(*args,**kv)

def test():

    print("Function test begins running.")

    time.sleep(0.2)

    print("Function test ends running.")

    return "測試"


print("經過2層裝飾器函數名更替爲:%s" % test.__name__)

print(test())

print("-----------------------------------------")

'''

上述裝飾器都是簡單的兩層。

若是裝飾器自己須要傳入參數,則須要3層(應用場景如:登陸網頁使用微信、QQ、仍是郵箱)。

'''



def login(login_type):

    def timmer(func):

        #@functools.wraps(func)

        def wrapper(*args, **kv):

            time_b = time.time()

            if login_type == "QQ":

                print("Login by QQ.")

                return (func(*args, **kv))

            else:

                print("Login by Others.")

                return (func(*args, **kv))

            time_e = time.time()

            print("Function %s runned for %ss" % (func.__name__, (time_e - time_b)))

        return wrapper  # 注意這個return的位置

    return timmer # 注意這個return的位置


# 寫在裝飾的函數的前面,裝飾多個函數,每一個函數前面需加上@decorator

@login("QQ")  # test = timmer(test) = wrapper, 調用時test() = wrapper(),這裏說明參數的傳輸問題

# test(*args,**kv) = wrapper(*args,**kv)

def test():

    print("Function test begins running.")

    time.sleep(0.2)

    print("Function test ends running.")

    return "測試"



print("經過3層裝飾器函數名更替爲:%s" % test.__name__)

print(test())

相關文章
相關標籤/搜索