(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦
装饰器(Decorator):
装饰器的方便在于可以在不修改原代码基础上,新增其他功能。
例如,可以函数加一个输出函数运行时间的功能:
import math
import time
def display_time(func): #装饰器也就是一个函数
def wrapper(*args): #再来一个函数
t1 = time.time()
res = func(*args) #引入func函数, 挺方便哒
t2 = time.time()
print("Total time: {:.4} s".format(t2-t1))
print("Total time: %.4f s %s king"%(t2-t1,'RNG and RW'))
return res
return wrapper
def is_prime(num): #判断是不是素数
if num < 2:
return False
elif num <= 3:
return True
else :
tmp = int(math.sqrt(num)) + 1
for i in range(2, tmp):
if num % i == 0:
return False
return True
@display_time #装饰器就是加一句这个代码
def prime_num(num):
cnt = 0
for i in range(2, num + 1):
if is_prime(i):
cnt += 1
return cnt
cnt = prime_num(100)
print( cnt )
参数不定怎么办呢?
不定参数的装饰器
#带有不定参数的装饰器
import time
def deco(func):
def wrapper(*args, **kwargs):
startTime = time.time()
func(*args, **kwargs)
endTime = time.time()
msecs = (endTime - startTime)*1000
print("time is %d ms" %msecs)
return wrapper
@deco
def func(a,b):
print("hello,here is a func for add :")
time.sleep(1)
print("result is %d" %(a+b))
@deco
def func2(a,b,c):
print("hello,here is a func for add :")
time.sleep(1)
print("result is %d" %(a+b+c))
func(1,2)
func2(1,2,3)
可以多用装饰器吗?
多个装饰器
#多个装饰器
import time
def deco01(func):
def wrapper(*args, **kwargs):
print("this is deco01")
startTime = time.time()
func(*args, **kwargs)
endTime = time.time()
msecs = (endTime - startTime)*1000
print("time is %d ms" %msecs)
print("deco01 end here")
return wrapper
def deco02(func):
def wrapper(*args, **kwargs):
print("this is deco02")
func(*args, **kwargs)
print("deco02 end here")
return wrapper
@deco01
@deco02
def func(a,b):
print("hello,here is a func for add :")
time.sleep(1)
print("result is %d" %(a+b))
func(3,4)
'''
this is deco01
this is deco02
hello,here is a func for add :
result is 7
deco02 end here
time is 1003 ms
deco01 end here
'''