一、装饰器
在不改变函数逻辑的情况下,为函数添加额外功能
二、装饰器实现代码
先实现质数查询的函数
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
评论区