python函式裝飾器的用法

2021-08-27 18:02:34 字數 3209 閱讀 9636

一、什麼是裝飾器

用來給其他固定函式增加其他功能的一種函式。

裝飾器的實現是函式裡面巢狀函式,讓其他函式在不需要做任何**改動的前提下增加額外功能。

裝飾器需要傳遞乙個函式,返回值也是乙個函式物件

二、裝飾器的應用舉例

1.需求:使用者登陸驗證的裝飾器,如果使用者登陸成功,則執行被裝飾的函式,如果登陸失敗,則執行登陸函式

import functools    #匯入此包可以用來顯示被裝飾函式的名字和裡面的注釋塊

login_users = ['admin', 'root'] #定義乙個使用者名稱列表

def is_login(fun): #定義裝飾器函式

@functools.wraps(fun) #加入此語句就可以顯示被裝飾函式的名字和裡面的注釋塊

# 判斷寫部落格這個使用者是否登陸成功

if kwargs.get('name') in login_users:

res = fun(*args, **kwargs)

return res

else:

res = login()

return res

def login():

return '登陸。。。'

@is_login #將裝飾器加到需要被裝飾的函式上面

def writeblog(name):

return '編寫部落格。。'

print writeblog(name='adminss')

2.map函式和匿名函式lambda

map函式:第乙個引數為乙個函式,第二個引數是乙個序列(就相當於為第乙個引數的引數)

def f(x):

return x*x

# map()傳入的第乙個引數是乙個函式,第二個引數是乙個序列

print map(f,[1,2,3,4])

print map(lambda x:x*x,[1,2,3,4]) #當不知道函式要起什麼名字的時候就叫lambda

3.多個裝飾器的用法以及呼叫順序

呼叫規則:依次從下往上呼叫

需求:先驗證是否登陸成功再驗證許可權

def is_root(fun):    #此裝飾器用來驗證是否有root許可權

@functools.wraps(fun) #此語句用來顯示被裝飾函式的名字及內部的注釋塊資訊

# inspect.getcallargs返回值是字典,key值為:形參 value值:形參對應的實參

inspect_res = inspect.getcallargs(fun, *args, **kwargs)

print 'inspect_res的返回值:%s' % inspect_res

if inspect_res.get('name') == 'root':

res = fun(*args, **kwargs)

return res

else:

print 'error:no permisson add studnet'

login_session = ['root', 'admin', 'redhat'] #使用者名稱列表

def is_login(fun): #是否登陸成功裝飾器

@functools.wraps(fun)

def warrper(*args, **kwargs):

if args[0] in login_session:

res = fun(*args, **kwargs)

return res

else:

print 'error:%s未登陸!' % args[0]

return warrper

@is_login

@is_root #裝飾器起作用是從下往上呼叫裝飾器

def add_student(name):

print '新增學生資訊。。'

add_student('root')

4.帶有引數的裝飾器

def log(kind):  #定義帶有乙個引數的裝飾器

def add_log(fun):

@functools.wraps(fun)

start_time = time.time()

res = fun(*args,**kwargs)

end_time = time.time()

return res

return add_log

@log('westos') #在裝飾函式的時候傳遞引數

def add(x,y):

time.sleep(1)

return x+y

print add(1,2)

5.如何隨機生成100個大小寫字母

import random 

import string

li = [random.choice(string.ascii_letters) for i in range(100)]

#隨機生成100個大小寫字母

6.需求:編寫裝飾器required_inits,條件如下:確保函式接收到的每乙個引數都是整數,如果引數不是整形數,列印typeerrot:引數必須為整形

import functools

def required_ints(fun):

@functools.wraps(fun)

for i in args: #遍歷函式fun傳進來的引數

if not isinstance(i, int): 判斷是否為整數

print 'typeerror:引數必須為整形'

break

else:

res = fun(*args, **kwargs)

return res

@required_ints

def add(a, b):

return a + b

@required_ints

def mymax(a,b,c,d):

return max(a,b,c,d)

print add(1,2)

print mymax(1,2,3,4)

python函式裝飾器 的用法

是python中的乙個語法糖,decorator表示宣告乙個函式裝飾器,這條宣告語句中,decorator通過 被宣告為了函式裝飾器,其作用是對緊接著定義的函式進行進一步的裝飾,並返回與被裝飾函式同名的函式。decorator用法規則 1 裝飾器函式decorator需要先定義 2 當要裝飾乙個函式...

Python 函式裝飾器及用法

函式裝飾器的工作原理是怎樣的呢?假設用 funa 函式裝飾器去裝飾 funb 函式,如下所示 funa 作為裝飾器函式 deffuna fn fn 執行傳入的fn引數 return funa deffunb 實際上,上面程式完全等價於下面的程式 def funa fn fn 執行傳入的fn引數 re...

python 裝飾器的用法

先從乙個小例子開始,然後逐步引出裝飾器的作用。def name name james print my name is format name name 輸出結果為 my name is james.如果此時想在列印 my name is.之前加上打招呼的語句,且不能修改name 函式,就可以使用裝...