python的裝飾器的簡單案例
阿新 • • 發佈:2018-12-28
裝飾器本質上是一個Python函式,它可以讓其他函式在不需要做任何程式碼變動的前提下增加額外功能,裝飾器的返回值也是一個函式物件。它經常用於有切面需求的場景,比如:插入日誌、效能測試、事務處理、快取、許可權校驗等場景。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量與函式功能本身無關的雷同程式碼並繼續重用。概括的講,裝飾器的作用就是為已經存在的物件新增額外的功能。
簡單裝飾器:
# coding=utf-8
def fun(func):
def wrapper(*args, **kwargs):
print 'name-->%s' % func.__name__
return func(*args, **kwargs)
return wrapper
@fun
def boo():
print 'i is boo!'
boo()
具體處理函式的情況如下
# coding=utf-8
def fun(func):
@wraps(func) #保證原函式的資訊不變
def wrapper(*args, **kwargs):
print 'name-->%s' % func.__name__
t = func(*args, **kwargs)
print t
return t
return wrapper
@fun
def boo(a, b):
print 'i is boo!'
return a + b
boo(10, 11)
帶引數的裝飾器:
# coding=utf-8
def fun(level):
def decorator(func):
def wrapper(*args, **kwargs):
print 'name-->%s' % func.__name__
t = func(*args, **kwargs)
print t, level
return t
return wrapper
return decorator
@fun(level=5)
def boo(a, b):
print 'i is boo!'
return a + b
boo(10, 11)
類裝飾器
再來看看類裝飾器,相比函式裝飾器,類裝飾器具有靈活度大、高內聚、封裝性等優點。使用類裝飾器還可以依靠類內部的__call__方法,當使用 @ 形式將裝飾器附加到函式上時,就會呼叫此方法。
class Demo(object):
def __init__(self, func):
self._func = func
pass
def __call__(self, *args, **kwargs):
print '-----------'
t = self._func(*args, **kwargs)
print t
return t
@Demo
def boo(a, b):
print 'i is boo!'
return a + b
boo(10, 11)
內建裝飾器
@staticmathod、@classmethod、@property
裝飾器的順序
@a
@b
@c
def f ():
等效於
f = a(b(c(f)))