装饰器工厂函数

Posted huaibin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器工厂函数相关的知识,希望对你有一定的参考价值。

"""
需求:参数传入0 希望时间用整数显示,参数传入1 用浮点数显示
"""
import time


def get_run_time(flag):
    """装饰器工厂函数"""

    def get_time(func):
        """装饰器函数:对函数运行时间进行统计"""
        print(in get_time)

        def inner(*args, **kwargs):
            t1 = time.time()
            res = func(*args, **kwargs)
            t2 = time.time()
            if flag == 0:
                print(运行了%d s % (t2 - t1))
            else:
                print(运行了%f s % (t2 - t1))
            return res

        return inner

    return get_time


# 装饰器工厂函数的作用:
# 1.>接收装饰器函数所需要但是又不能直接接受的参数---->接收参数
# 2.>生产装饰器对象---->产生装饰器函数

# 关联: 装饰器工厂内部是装饰器函数
# 真正执行过程:
# 1.> get_time = get_run_time(参数)
# 2.> @get_time 对func1函数进行装饰  func1 = get_time(func1)
@get_run_time(0)  # 这句话的返回值是get_time这个函数名
def func1(num, age=18):
    for i in range(3):
        time.sleep(1)
        print(in func, num, age)


# @get_run_time(1) 注意:这个要分开看    f1 = get_run_time(1) 这是一个整体,函数调用,然后返回一个值
# @f1 这才是真正的装饰器函数开始了

func1(89)

"""
问题:
1.>装饰器工厂函数是装饰器函数吗?
不是,工厂内部定义了装饰器函数,并且return装饰器函数的引用
2.>装饰器工厂函数和装饰器的关系?
工厂的返回值是装饰器函数的引用.它的作用就是创建一个装饰器函数的对象<或者叫地址引用更合适>
"""

多个装饰器装饰一个函数:

"""
<i> 斜体
<b> 加粗,黑体


多个装饰器:同时扩展多个功能
"""

def makeBold(func):
    """加粗"""
    def inner(*args,**kwargs):
        return <b> + func() + </b>
    return inner


def makeItalic(func):
    """倾斜"""
    def inner(*args,**kwargs):
        return <i> + func() + </i>
    return inner

@makeItalic
@makeBold
@makeItalic
def f1():
    return 人生苦短,我用Python


print(f1())
# <i><b><i>人生苦短,我用Python</i></b></i>

# 执行顺序,先倾斜,后加粗, 类似于穿衣服,内衣先,外套后

# 灵魂代码理解:  f1 = makeItalic(f1)

# 1.>f11 = makeItalic(f1) f11是  makeItalic 里面的inner ;
# 2.>f111 = makeBold(f11) f111是makeBold 里面的inner

# 一步理解:  f1 = makeBold(makeItalic(f1))    ------> 简单理解就是多层装饰了
# 类似于寄快递,自己包一层之后快递小哥也会帮你再去 包一层.

# 执行顺序一定是先去执行最内层的.<最内层的装饰器先完成装饰>
# 但是是最外层的最先开始装饰,它需要内层的装饰完成才能去装饰.

以上是关于装饰器工厂函数的主要内容,如果未能解决你的问题,请参考以下文章

Python函数加工厂-装饰器

如何在 python 中对装饰器工厂输入进行单元测试

闭包函数与装饰器

Python 参数化装饰器

Python装饰器笔记

TypeScript装饰器