装饰器本质是闭包的语法糖。
Python装饰器的为了给被修饰函数,添加额外功能,这种添加功能的方式能够在不改变原函数形式的条件下,添加额外功能
# def getzsq(char):
# def check(func): 这是修饰函数(也是外函数)
# a = 10000
# def inner(b): 这是内函数
# print("登录验证", b, char)
# ret = func(b, char) 这是被修饰函数
# return ret
# return inner
# return check
# 外函数与内函数组的成闭包
# @getzsq("oooo")
# # fss:其实是inner内函数 = check(fss:被修饰函数)
# def fss(x, y):
# print("发说说", x, y)
#
# # fss = check(fss)
#
# if __name__ == '__main__':
# fss(1)
# class chen():
# def __init__(self):
# print(id(self))
#
# p = chen()
# print(id(p))
import time
def zsq(func):
startime = time.time()
def inner():
func()
time.sleep(3)
endtime = time.time()
print(endtime-startime)
return inner
@zsq
def p():
kong = []
for i in range(1000):
kong.append(i)
# print(kong)
# p函数是为被修饰函数,被修饰完在调用已经添加了额外的计时功能
if __name__ == '__main__':
p()
一句话来说,@zsq这就等同于p = zsq(p),右边这个p很好理解就是p函数对象,左边这个p是inner,是inner,是inner,重说三。如果p函数是有参数输入的,那么inner必须要接受。
def decorete(func):
def aim(*args):
ret1 = func(*args)
print("输出%s" % args)
return ret1+100000
return aim
# decorete(aim)(10)
@decorete # aim = decorete(aim)
def aim(x): #111111111111111
print("%s被装饰了" % x)
return 1
# aim = decorete(aim)
ret2 = aim(10))
再一句话来说,decorete装饰函数中的func函数返回值ret1就是111111111111处的aim的返回值,ret2的也就等同于 ret+100000
def getp(p):
def decorete(func):
def aim(*args):
ret1 = func(*args)
print("输出%s" % args)
print("输出%s" % p)
return ret1+100000
return aim
return decorete
# decorete(aim)(10)
@getp("zsq_per") # aim = decorete(aim)
def aim(x): #111111111111111
print("%s被装饰了" % x)
return 1
# aim = decorete(aim)
ret2 = aim(10))
再再一句话,如果装饰器需要传递参数咋办?这样写?@decorete(“zsq_per”),肯定不行因为装饰器是固定格式aim = decorete(aim),如果这么写@decorete(“zsq_per”),zsq_per是aim么,坑定不是。
再用一个函数来装饰装饰器.