# 裝飾器的概念
- 裝飾器的實現是函式裡面巢狀函式;
- 裝飾器的本質是乙個函式, 它可以讓其他函式在不需要做任何**改動的前提下增加額外的功能;
- 裝飾器需要傳遞乙個函式, 返回值也是乙個函式物件.
# 裝飾器的應用場景
- 計時器
- 記錄日誌
- 使用者登入驗證
- 函式引數驗證
如圖所示,函式func1輸出時運用函式outer進行了裝飾
顯示結果為
import functools #functools模組用於高階函式:作用與或者返回其它函式的函式。一般來說,對於該模組,任何可呼叫物件都可以視為乙個函式。
import time #引入時間模組
#執行程式開始時間
res = fun(*args,**kwargs)
#執行程式
end_time = time.time()
# log('debug') 返回值:add_log
# add = add_log(add)
@log('debug')
def add(x,y):
time.sleep(1)
#延時一秒執行
return x+y
print add(1,2)
練習1# 編寫裝飾器required_types, 條件如下:
# 1). 當裝飾器為@required_types(int,float)確保函式接收到的每乙個引數都是int或者float型別;
# 2). 當裝飾器為@required_types(list)確保函式接收到的每乙個引數都是list型別;
# 3). 當裝飾器為@required_types(str,int)確保函式接收到的每乙個引數都是str或者int型別;
# 4). 如果引數不滿足條件, 列印 typeerror:引數必須為***x型別
import functools
return required
@required_types(str,str)
def add(a, b):
return a + b
print add('hello','python')
練習2需求:驗證使用者登陸的裝飾器is_login
1.如果使用者登陸成功,則執行被裝飾的函式
2.如果使用者登陸不成功,則執行登陸函式
"""import functools
login_users = ['admin', 'root']
@is_login
def writeblog(name):
return '編寫部落格'
def login():
return '登陸。。。'
print writeblog(name='admin')
練習3編寫裝飾器required_ints, 條件如下:
# 1). 確保函式接收到的每乙個引數都是整數;
# 2). 如果引數不是整形數, 列印 typeerror:引數必須為整形
import functools
@required_ints
def add(a, b):
return a + b
@required_ints
def mymax(a, b, c, d):
return max(a, b, c, d)
print mymax(1,2,3,4.0)
練習4"""
import functools
import time
@add_log
def add(x,y):
time.sleep(1)
return x+y
print add(1,2)
練習5帶有多個裝飾器的函式
# 需求: 使用者登陸驗證的裝飾器is_login
# # 1). 如果使用者登陸成功, 則執行被裝飾的函式;
# # 2). 如果使用者登陸不成功, 則執行登陸函式
# #需求: 判斷登陸使用者是否未管理員is_admin(此處管理員只有乙個為:admin使用者)
# # 1).如果使用者為管理員, 則執行被裝飾的函式;
# # 2).如果使用者不是管理員, 則報錯;
"""import functools
login_users = ['admin', 'root']
@is_login
@is_admin
def writeblog(name):
return '編寫部落格'
def login():
return '登陸。。。'
print(writeblog(name='root'))
python中裝飾器
對修改是封閉的,對擴充套件是開放的 import time def f1 print time.time print this is a function.def f2 print this is a function.print time.time f1 def print current tim...
python中裝飾器詳解
最新學了裝飾器,有乙個疑問一直困擾我,思考了幾天,終於明白。首先,展示正常的裝飾器 允許向乙個現有的物件新增新的功能,同時又不改變其結構,就是給函式穿個衣服,但是不改變函式 該如何寫?def log func print call s func.name return func args,kw 依照...
python中裝飾器理解
裝飾器 decorators 是 python 的乙個重要部分。簡單地說 他們是修改其他函式的功能的函式。他們有助於讓我們的 更簡短!由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 ...