码迷,mamicode.com
首页 > 其他好文 > 详细

装饰器工厂函数

时间:2019-12-26 12:56:09      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:创建   res   工厂   make   print   执行顺序   返回   理解   python   

"""
需求:参数传入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))    ------> 简单理解就是多层装饰了
# 类似于寄快递,自己包一层之后快递小哥也会帮你再去 包一层.

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

装饰器工厂函数

标签:创建   res   工厂   make   print   执行顺序   返回   理解   python   

原文地址:https://www.cnblogs.com/huaibin/p/12101187.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!