學習Python之路之函式裝飾器高階用法

2021-08-27 20:39:35 字數 2670 閱讀 5760

案例:

import functools

import time

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)

執行結果:

裝飾器就是為了補修改原來函式的**,以達到增加功能的作用,其實為了裝飾器更通用化;引數可以巢狀函式裡用來實現隱藏,並且實現全域性引數的功能,與函式一起繫結,結合這兩個知識點,就可以產生通用的帶有引數的裝飾器了。

案例:

import time

import functools

def title(kind):

def printstar(func):

@functools.wraps(func)

def f(*args,**kwargs):

res=func(*args,**kwargs)

print ',函式名:%s,執行返回值結果:%d'%(kind,title.__name__,res)

案例

案例在實際應用場景中,會採用多個裝飾器,先驗證是否登陸成功,再驗證許可權

import functools

import inspect

def is_root(fun):

@functools.wraps(fun)

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 student'

login_session = ['root','admin','redhat']

def is_login(fun):

@functools.wraps(fun)

if args[0] in login_session:

res =fun(*args,**kwargs)

return res

else:

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

@is_login

@is_root

def add_student(name):

print '新增學生資訊...'

Python學習之路 裝飾器(1)

裝飾器本身是利用閉包實現的,因此只有真正學會了閉包中的知識點才能完全理解裝飾器的語法。試想乙個問題 在乙個工程中有乙個函式func 現在有乙個需求是func 現在本身不能滿足的,因此需要重新實現func 的功能。這是正常的思路,也是可行的,但是卻違背了開發中的 開放 封閉 原則。封閉 函式本身的功能...

Python學習之路 裝飾器(2)

coding utf 8 def f1 func print in f1 def f1 inner print in f1 inner func return f1 inner def f2 func print in f2 def f2 inner print in f2 inner func r...

Python學習之路 裝飾器(3)

上兩篇提到的裝飾器的例子中,被修飾的函式沒有引數,那麼如果修飾帶引數的裝飾器又該如何書寫呢?coding utf 8 def f1 func print in f1 def f1 inner print in f1 inner func return f1 inner f1def f a,b pri...