一、不带参数
在不改变原有代码的情况下增加新功能
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
四、实际使用:函数加入线程执行装饰器
#! -*- coding:utf-8 -*
import threading
import time
from functools import wraps
def async_thread(func):
@wraps(func)
def wrapper(*args, **kwargs):
t = threading.Thread(target=func, args=args, kwargs=kwargs)
t.start()
return t
return wrapper
@async_thread
def my_function(name, interval):
print(f"Function {name} is starting in thread {threading.current_thread().name}.")
time.sleep(interval)
print(f"Function {name} is finished in thread {threading.current_thread().name}.")
if __name__ == '__main__':
my_function("test1", 5)
my_function("test2", 3)
print("end......")