装饰器
把一个函数当作参数,返回一个替代版的函数
本质就是返回函数的函数
“在不改变原有函数的基础上,给函数增加功能”
def fc1():
print("1")
def ou(suiyi):
def inn():
fc1()
print("2")
return inn
cese=ou(fc1)
cese()
装饰器
def decorator(asasaaa):
def wrapper(*args):
asasaaa(*args) #a1
print("1")
return wrapper
@decorator #a2
def f1(funcname):
print(funcname)
@decorator #a3
def f2(*args):
print(args)
f1("a")
f2("a","b","c")
#a1 结合#a2a3表示,只要在前面写了@decorator
会自动匹配参数值对应的函数并且也会执行print(1)你原本函数的内容
#a1可以自定义名字,因为#a2 #a3 会自动匹配
其中@decorator 和def decorator 名称要一致
便于理解的形式如下
def decora(f1):
def a(a,b):
f1(a,b)
print("1")
f1(a,b)
return a
@decora
def f1(a,b):
print(a+b)
f1(3,4)
也可以
装饰器中的返回值:如果函数有返回值,那么装饰器中也必须有返回值
def decora(f1):
def a(*args,**kwargs):
# f1(a,b)
print("1")
f1(*args,**kwargs)
return a
@decora
def f2(*args):
print(args)
f2(1,2)
import string
import random
import time
import functools
num=[(random.choice(string.ascii_letters+string.digits)) for i in range(100)]
def zs(fc):
@functools.wraps(fc) #保留函数名词和文档信息
def wrap(*args,**kwargs):
start_time=time.time()
res=fc(*args,**kwargs)
end_time=time.time()
print("时间为%.7fs"%(end_time-start_time))
return res
return wrap
@zs
def fc1():
'''s+i'''
s=''
for i in num:
s+=i+""
@zs
def fc2():
'''join'''
# "".join(num)
return "".join(num)
fc1()
print(fc1.__doc__)
fc2()
print(fc2.__doc__)
print(list(fc2()))
# _*_coding:utf-8_*_
'''
Name:20.5.py
Date:1/12/19
Author:hzp
Connect:[email protected]
'''
import string
import random
import time
import functools
num=[(random.choice(string.ascii_letters+string.digits)) for i in range(100)]
print(num)
def zs(fc):
@functools.wraps(fc) #保留函数文档信息
def wrap(*args,**kwargs):
start_time=time.time()
res=fc(*args,**kwargs)
end_time=time.time()
print("时间为%.7fs"%(end_time-start_time))
return res
return wrap
@zs
def fc1():
'''s+i'''
s=''
for i in num:
s+=i+""
print(s)
@zs
def fc2():
'''join'''
print("".join(num))
fc1()
print(fc1.__doc__)
fc2()
print(fc2.__doc__)