装饰器推导流程
""""
在不改变原函数体代码及调用方式的情况下,为原函数添加新的功能
条件 1.不改变原函数体代码
2.不改变原函数体的调用方式
结果 添加新的功能
"""
import time
# 原函数
# def index():
# print("from index")
# index()
# 需求添加计时器功能 就是计算运行时间
# 因为函数定义阶段不能动 所以只能动调用阶段
# import time
# def index():
# print("from index")
#
# start = time.time()
# index()
# time.sleep(0.3)
# end = time.time()
# print(end - start)
# 虽然实现了 但是
# 每次调用都得重新写一遍
# 重新写一遍 重新写一变 代码的重用
# 1. 循环 2.函数 有这两种方式的实现 而我们需要在不同的位置重用代码
# 所以我们选择函数 把代码缩进 进去
# def index():
# print("from index")
#
# def inner():
# start = time.time()
# index()
# time.sleep(0.3)
# end = time.time()
# print(end - start)
# inner(index)
# 虽然实现了但是原函数写死了 现在只能统计index的执行时间了
# 不就原函数写死 我把他提上去 变成形参
# def index():
# print("from index")
#
# def inner(xxx):
# start = time.time()
# xxx()
# time.sleep(0.3)
# end = time.time()
# print(end - start)
# inner(index)
# 但是条件不符合 调用方式改变了
# 因为是在传参的时候遇到了问题所以 这种传参pass
# 但是我们学了两种传参方式既然这种不行那就换一种
# 闭包
# 闭包的定义 在内部函数引用外部函数的名字
# def index():
# print("from index")
#
# def outer(xxx):
# def inner():
# start = time.time()
# xxx()
# time.sleep(0.3)
# end = time.time()
# print(end - start)
# return inner
#
# index = outer(index)
# indexr()
# 这只是如果原函数是无参函数的时候
# 当有参函数的时候怎么办
# 就可以用可变长形参和可变长实参来接收 和传递
# def index(aa, ):
# print("from index", aa)
#
#
# def outer(xxx):
# def inner(*args, **kwargs): # 他是怎么接的
# start = time.time()
# xxx(*args, **kwargs) # 我就是怎么传的
# time.sleep(0.3)
# end = time.time()
# print(end - start)
#
# return inner
#
#
# inner = outer(index)
# inner(aa=1)
# def aa(*args, **kwargs):
# # print(args, kwargs)
# print(*args, **kwargs) # [1, 2, 3] {'user': 'jason', 'pwd': 123}
# print 不了 **字典
#
# aa(x=1)
# print(x=1) 就会报错
# 形参 的 * 多余的位置参数以元组的形式接收给 * 后args
# 实参 的 * 就是for循环 一个个取出来 然后一次性的传给函数
# 形参 的 ** 会把多余的关键字参数 以键值对的形式 放在字典里
# 实参 的** 会把字典里的键值对写成 键=值的形式
# 需求当原函数有返回值的时候 怎么办
def index(aa, ):
print("from index", aa)
return "嘿嘿嘿"
def outer(xxx):
def inner(*args, **kwargs): # 他是怎么接的
start = time.time()
res =xxx(*args, **kwargs) # 我就是怎么传的
time.sleep(0.3)
end = time.time()
print(end - start)
return res
return inner
index = outer(index)
res = index(aa=1)
print(res)
# 只用那个值来接收原函数的返回值 然后在把它返回出来就行了
# 这样一个装饰器的就完成了 只是需要自己先写 inner = outer(index)