#!/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())