一、不带参数
在不改变原有代码的情况下增加新功能
from functools import wraps
def decortor(func):
@wraps(func)
def wrapper(*arg,**kwargs):
"""
代码段
"""
return func(*args,**kwargs)
return wrapper
@decortor # 相当于 decortor(test())
def test():
print(test.__name__)
warps 作用: 消除(被装饰后的函数名等属性的改变)副作用
示例:带wraps时,打印 test
不带wraps时,打印 wrapper
二、带参数
def authorized(permission):
def decorator(func):
@wraps(func)
def wrapper(*args,**kwargs):
if permission & 5 == permission:
print("有权限")
else:
print("无权限")
return func(*args,**kwargs)
return wrapper
return decorator
@authorized(5)
def test():
print(test.__name__)
三、装饰器类
class GetMethod():
# 有参时加__init__
def __init__(self, params):
self.params = params
def __call__(self, func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
print(func.__name__)
a,b = args[0],args[1]
return a + b + 10
except Exception as e:
return e
return wrapper
@GetMethod("params")
def test(a,b):
return a + b
print(test(1,2)) # 1+2+10=13