裝飾器:修飾別人的工具,修飾新增功能,工具指的是函式
裝飾器本身可以是任何可呼叫物件,被裝飾的物件也可以是任意可呼叫物件
為什麼要用裝飾器:
開放封閉原則:對修改是封閉的,對擴充套件是開放的
裝飾器就是為了在不修改被裝飾物件的源**以及呼叫方式的前提下,為期新增新功能
基本裝飾器
#!/usr/bin/python
# -*- coding utf8 -*-
'''閉包:惰性計算
'''import time
def timmer(func):
start_time=time.time()
res=func(*args,**kwargs) #func 即為index函式
stop_time=time.time()
print('runtime is : %s' %(stop_time - start_time))
return res
@timmer #index=timmer(index) 把下方函式當做引數傳入
def index():
time.sleep(3)
print('welcome to xp')
return 1
擴充套件內容
#!/usr/bin/python
# -*- coding utf8 -*-
def index():
print('welcome to index page')
def home(name):
print('welecome to home page %s' %name)
#新增使用者認證
def auth(func):
name=input('input name: ')
password = input('input password: ')
if name=='xp' and password =='1':
print('\033[45mlogin successful\033[0m')
else:
print('\033[45mlogin error\033[0m')
res =func(*args,**kwargs)
return res
@auth
def index():
print('welcome to index page')
@auth
def home(name):
print('welecome to home page %s' %name)
#index() #此處認證有問題 需要多次輸入賬號密碼
#home('wuxp')
#------------------------修正----------------------
login=
def auth(func):
if login['user'] and login['status']:
res = func(*args, **kwargs)
return res
else:
name=input('input name: ')
password = input('input password: ')
if name=='xp' and password =='1':
login['user'] = 'xp'
login['status'] = true
print('\033[45mlogin successful\033[0m')
else:
print('\033[45mlogin error\033[0m')
res =func(*args,**kwargs)
return res
@auth
def index():
print('welcome to index page')
@auth
def home(name):
print('welecome to home page %s' %name)
#index() #重複認證問題已經修復 但是此處可以再次增加認證方式的選擇 增加閉包函式 操作如下
#home('xp')
#-----------------修正--------------------------------
login=
def auth(driver='file'):
def auth2(func):
if driver == 'file':
if login['user'] and login['status']:
res = func(*args, **kwargs)
return res
else:
name=input('input name: ')
password = input('input password: ')
if name=='xp' and password =='1':
login['user'] = 'xp'
login['status'] = true
print('\033[45mlogin successful\033[0m')
else:
print('\033[45mlogin error\033[0m')
res =func(*args,**kwargs)
elif driver == 'ldap':
print('ldap auth')
elif driver == 'mysql':
print('mysql auth')
elif driver == 'other':
print('other auth')
return func(*args,**kwargs) #(不做認證 直接呼叫)
return auth2
import time
@auth('file') #立即執行auth 執行結果為auth2 ----->auth2(index)---warpper
def index():
print('welcome to index page')
time.sleep(3)
@auth(driver='mysql')
def home(name):
print('welecome to home page %s' %name)
#index()
#home('xp')
#---------------裝飾器疊加---------------
def timmer(func):
start_time=time.time()
res=func(*args,**kwargs) #func 即為index函式
stop_time=time.time()
print('runtime is : %s' %(stop_time - start_time))
return res
@auth('file') #立即執行auth 執行結果為auth2 ----->auth2(index)---auth的warpper
def index():
print('welcome to index page')
time.sleep(3)
@auth(driver='mysql')
def home(name):
print('welecome to home page %s' %name)
#index()
#home('xp')
'''注意 此處auth的輸入時間會占用 導致程式執行結果可能不準確 可以更改執行順序
input name: xp
input password: 1
login successful
welcome to index page
runtime is : 5.263926029205322
'''@auth('file')
@timmer
def index():
print('welcome to index page')
time.sleep(3)
index()
'''執行結果更加準確
input name: xp
input password: 1
login successful
welcome to index page
runtime is : 3.0006983280181885
'''
python 裝飾器有哪些 裝飾器
由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2013 12 25 f now f 2013 12 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函...
裝飾器 有參裝飾器
有參裝飾器 是為裝飾器提供多樣功能選擇的實現提供的,實現原理是三層閉包。有參裝飾器的基本模板 def outter x defoutter1 func res func args,kwargs print x return res return return outter1 通過第三層進行傳值,使得...
python裝飾器 裝飾器
由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...