装饰器函数其实是这样一个接口约束,它必须接受一个callable对象作为参数,然后返回一个callable对象。那么用类来实现也是也可以的。我们可以让类的构造函数init()接受一个函数,然后重载call()并返回一个函数,也可以达到装饰器函数的效果。
本文不会讲解太多细节,直接给出可用的示例。
详细解释地址:https://realpython.com/primer-on-python-decorators/
一:不带参数的装饰器类
假定我们需要一个装饰器,其可以把被修饰函数的结果改为指定的样式,如{'message': 'ok', 'data': 0}形式,则
class FormatResult(object):
def __init__(self, func):
"""
本装饰器是个无参数装饰器类,则被修饰函数将被传递到本构造函数中,
然后默认__call__是包装函数
"""
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())
实际结果有原来的
output: 1
output: {'state': 'ok', 'data': 1}
二:带参数的装饰器类
假定我们需要一个装饰器,其可以把被修饰函数的结果改为指定的样式,如{'message': 'ok', 'data': 0}形式,但其允许控制大小写形式。参考实现为
class FormatResult2(object):
def __init__(self, upper_message=False):
"""
本装饰器是个有参数装饰器类,则将参数传递给__init__,
然后调用__call__包装函数(这里就相当于装饰器函数的定义)
"""
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())
实际结果:'ok'被改为大写形式
output:{'message': 'OK', 'data': 1}
网友评论