# coding:utf-8
import logging
import time
from functools import wraps
logger = logging.getLogger(__name__)
def roll_back(func):
"""类中使用的装饰器"""
@wraps(func) # 在使用装饰器过程中的文档字符串的处理
def _inner(self, *args, **kwargs): # 此处的 self 为类的实例化对象,可以创建多个实例化对象打印 id 查看
try:
st = time.time()
f_res = func(self, *args, **kwargs)
time.sleep(0.5)
logger.warning("cost time : {}".format(time.time() - st)) # 模拟装饰器增加功能
return f_res
except Exception as e:
logger.error(str(e))
self.occur_err() # 当出现异常的时候调用实例化对象绑定的方法
return False
return _inner
class ClsDemo(object):
def __init__(self):
pass
@roll_back
def work(self, a: int, b: int) -> int: # 数据类型的检测,在pycharm中会有类型检测提示
"""装饰器增加功能"""
return a + b
def occur_err(self):
logger.error("程序运行异常")
if __name__ == '__main__':
cls_obj_1 = ClsDemo()
cls_obj_2 = ClsDemo()
res1 = cls_obj_1.work(2, b=3)
print(45, res1)
res2 = cls_obj_2.work('5', b=6)
print(48, res2)
网友评论