一、装饰器
在不改变函数逻辑的情况下,为函数添加额外功能
二、装饰器实现代码
先实现质数查询的函数
test_prime.py
# coding=utf-8 """ @Project :pachong-master @File :test_decorator.py @Author :gaojs @Date :2022/7/16 21:12 @Blogs : https://www.gaojs.com.cn """ import time def prime_number(num): """ 计算是否是质数 :return: """ if num < 2: return False elif num == 2: return True else: for i in range(2, num): if num % i == 0: return False return True def count_prime_number(maxnumber): """ 统计质数个数 :return: """ count = 0 t1 = time.time() for i in range(2, maxnumber): if prime_number(i): count += 1 print(count) t2 = time.time() print(f'***********************总共耗时 {t2 - t1} **************************') return count
未带装饰器执行结果
统计函数执行时长的装饰器
def display_time(func): """ 执行此函数耗时计算 :param func: :return: """ def wrapper(*args, **kwargs): t1 = time.time() result = func(*args, **kwargs) t2 = time.time() print('***********************总共耗时: {:.4} s **************************'.format(t2 - t1)) return result return wrapper def prime_number(num): """ 计算是否是质数 :return: """ if num < 2: return False elif num == 2: return True else: for i in range(2, num): if num % i == 0: return False return True @display_time def count_prime_number(maxnumber): """ 统计质数个数 :return: """ count = 0 for i in range(2, maxnumber): if prime_number(i): count += 1 print(count) return count count = count_prime_number(9999) print(count)
带上装饰器的执行结果
三、装饰器总结
这里会用到args和kwargs, 如果函数有传参和返回值,则装饰器也要有参数和返回值
def xx1(被装饰函数): def xx2(如果被装饰函数有参数那么输入): xxxxxxxxxxxxxxx 被装饰函数(如果被装饰函数有参数那么输入) xxxxxxxxxxxxxxx # 如果被装饰函数中含有reture则需要返回被装饰函数 # 没有则不需要 reture xx2
def xx1(func): """ 执行此函数耗时计算 :param func: :return: """ def xx2(*args, **kwargs): xxxxxxxxx # 如果函数fanc()有返回值,则需要接受返回值 result = func(*args, **kwargs) xxxxxxxxx return result return wrapper