装饰器推导流程

""""
在不改变原函数体代码及调用方式的情况下,为原函数添加新的功能
条件 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()

image
image

# 这只是如果原函数是无参函数的时候
# 当有参函数的时候怎么办
# 就可以用可变长形参和可变长实参来接收 和传递

# 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)

image

posted @ 2022-10-13 21:55  wwwxxx123  阅读(14)  评论(0编辑  收藏  举报