python裝飾器 有殘裝飾器 無參裝飾器

2021-08-01 19:13:26 字數 4337 閱讀 3203

裝飾器:修飾別人的工具,修飾新增功能,工具指的是函式

裝飾器本身可以是任何可呼叫物件,被裝飾的物件也可以是任意可呼叫物件

為什麼要用裝飾器:

開放封閉原則:對修改是封閉的,對擴充套件是開放的

裝飾器就是為了在不修改被裝飾物件的源**以及呼叫方式的前提下,為期新增新功能

基本裝飾器

#!/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 函式的...