裝飾器函數(shù)其實是這樣一個接口約束,它必須接受一個callable對象作為參數(shù)获列,然后返回一個callable對象谷市。那么用類來實現(xiàn)也是也可以的。我們可以讓類的構(gòu)造函數(shù)init()接受一個函數(shù)击孩,然后重載call()并返回一個函數(shù)迫悠,也可以達到裝飾器函數(shù)的效果。
本文不會講解太多細節(jié)巩梢,直接給出可用的示例创泄。
詳細解釋地址:https://realpython.com/primer-on-python-decorators/
一:不帶參數(shù)的裝飾器類
假定我們需要一個裝飾器,其可以把被修飾函數(shù)的結(jié)果改為指定的樣式括蝠,如{'message': 'ok', 'data': 0}形式鞠抑,則
class FormatResult(object):
def __init__(self, func):
"""
本裝飾器是個無參數(shù)裝飾器類,則被修飾函數(shù)將被傳遞到本構(gòu)造函數(shù)中又跛,
然后默認__call__是包裝函數(shù)
"""
self.func = func
def __call__(self, *args, **kwargs):
ret = self.func(*args, **kwargs)
return {"state": 'ok',
"data": ret}
@FormatResult
def my_func1():
return 1
if __name__ == '__main__':
print(my_func1())
實際結(jié)果有原來的
output: 1
output: {'state': 'ok', 'data': 1}
二:帶參數(shù)的裝飾器類
假定我們需要一個裝飾器碍拆,其可以把被修飾函數(shù)的結(jié)果改為指定的樣式,如{'message': 'ok', 'data': 0}形式慨蓝,但其允許控制大小寫形式感混。參考實現(xiàn)為
class FormatResult2(object):
def __init__(self, upper_message=False):
"""
本裝飾器是個有參數(shù)裝飾器類,則將參數(shù)傳遞給__init__礼烈,
然后調(diào)用__call__包裝函數(shù)(這里就相當于裝飾器函數(shù)的定義)
"""
self.upper_message = upper_message
def __call__(self, func):
def _dec(*args, **kwargs):
ret = func(*args, **kwargs)
message = 'ok'
return {"message": message.upper() if self.upper_message else message,
"data": ret}
return _dec
@FormatResult2(upper_message=True)
def my_func2():
return 1
if __name__ == '__main__':
print(my_func2())
實際結(jié)果:'ok'被改為大寫形式
output:{'message': 'OK', 'data': 1}