@ 修饰器
装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
引子
在写类的时候经常用到@staticmethod或@classmethod修饰符,这样就可以不需要实例化,直接类名.方法名()来调用。
所以修饰器用到好多地方的。
例子
"""
PyQt AND OpenCV
By LiNYoUBiAo
2020/4/19 19:49
"""
from functools import wraps
can_run = True
def decorator_name(f):
@wraps(f)
def decorated(*args, **kwargs):
if not can_run:
return "Function will not run"
return f(*args, **kwargs)
return decorated
@decorator_name
def func():
return("Function is running")
print(func())
can_run = False
print(func())
运行结果:
Logging应用
"""
PyQt AND OpenCV
By LiNYoUBiAo
2020/4/19 19:56
"""
from functools import wraps
def logit(func):
@wraps(func)
def with_logging(*args, **kwargs):
print(func.__name__ + "was called")
return func(*args, **kwargs)
return with_logging
@logit
def addition_func(x):
return x+x
result = addition_func(4)
运行结果:
多谢,美。
参考:
- 从浅到深讲解python修饰器:https://www.cnblogs.com/wolf-yasen/p/11240500.html
- 谈谈python修饰器:https://www.jianshu.com/p/ab702e4d4ba7
- function decorators:https://stackoverflow.com/questions/739654/how-to-make-a-chain-of-function-decorators