• 装饰器工厂函数


    """
    需求:参数传入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))    ------> 简单理解就是多层装饰了
    # 类似于寄快递,自己包一层之后快递小哥也会帮你再去 包一层.
    
    # 执行顺序一定是先去执行最内层的.<最内层的装饰器先完成装饰>
    # 但是是最外层的最先开始装饰,它需要内层的装饰完成才能去装饰.
  • 相关阅读:
    设计模式之观察者模式
    设计模式之模板方法模式
    设计模式之代理模式(全面讲解)
    设计模式之工厂模式(包含三种模式)
    设计模式之单例模式(包含三种方式)
    opencv+vs2015 堆内存析构异常
    用python来压缩文件
    GPT安装ubuntu的问题
    Two Sum and add Two Numbers
    [LeetCode] Palindrome Partitioning II
  • 原文地址:https://www.cnblogs.com/huaibin/p/12101187.html
Copyright © 2020-2023  润新知