Python装饰器的几种书写方式
python装饰器的几种使用方式,带参数,不带参数,闭包装饰器,以及类装饰器等
from functools import wraps import wrapt
class Authorparams(object):
"""带参数的类的装饰器"""
def __init__(self, level):
self.level = level
def __call__(self, func):
@wraps(func)
def warpper(*args, **kwargs):
print("在进入视图函数之前执行相应的代码")
return func(*args, **kwargs)
return warpper
class Authoritic(object):
"""不带参数类的装饰器"""
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs)
def funcAuthorit(func):
"""不带参数的闭包装饰器"""
@wraps(func)
def warpper(*args, **kwargs):
func1 = func(*args, **kwargs)
return func1
return warpper
def funcAuthorparams(level):
"""带参数的闭包装饰器"""
def functhor(func):
def warpper(*args, **kwargs):
print("在进入视图函数之前执行相应的代码")
return func(*args, **kwargs)
return warpper
return functhor
不带参数的装饰器(闭包装饰器)优化版
@wrapt.decorator
def wrapper(warpped, instance, args, kwargs):
print("在进入视图函数之前执行相应的代码")
return warpped(*args, **kwargs)
带参数的装饰器(闭包装饰器)优化版
def logging(level):
@wrapt.decorator
def wrapper(wrapped, instance, args, kwargs): # instance表明传入的对象的实例
print("在进入视图函数之前执行相应的代码")
return wrapped(*args, **kwargs)
return wrapper
@Authorparams(level="debug")
def test():
print("执行相应的功能代码")
if __name__ == '__main__': # 执行代码
test()