zoukankan      html  css  js  c++  java
  • python-18-装饰器形成固定模型

    前言

    装饰器可能有点陌生,但是装饰器它也是由函数而组成,那它有什么作用呢?

    其实就是:不想修改函数的调用方式,但可在原来的函数前后添加功能。开放封闭原则:

    • 对扩展是开放的
    • 对修改是封闭的

    一、装饰器初成

    1、还是这个例子,定义两个函数,func、timmer,简单来说 func 是执行所需的时间,timmer 是来计算传入的参数执行时长。

    2、可以看到timmer函数里面有一个被装饰的函数。既是 func 传入 timmer。

    # 1.装饰器初成
    import time
    def func():
        time.sleep(1)
        print('我在等待一秒钟')
    
    def timmer(f):                  # 装饰器函数
        def inner():
            start = time.time()
            f()                      # 被装饰函数
            end = time.time()
            print(end-start)
        return inner                # 别加 () 调用函数了,应传内部函数名字
    
    ff = timmer(func)
    ff()

    3、运行步骤如下图

     二、装饰器使用

    1、装饰器函数 timmer

    2、被装饰函数 func,直接@装饰器函数,执行顺序如上图所示。

    # 2.装饰器使用
    import time
    def timmer(f): 
        def inner():
            start = time.time()
            ret = f()
            end = time.time()
            return end-start, ret
        return inner  
    
    @timmer         # @装饰器函数名
    def func():     # 被装饰的函数
        time.sleep(1)
        return '我在等待一秒钟'
    print(func())

     三、万能参数装饰器

    1、万能传参,其实就是用我们前面所学的函数传参方法,*args 和 **kwargs

    # 3.万能参数装饰器
    import time
    def timmer(f): 
        def inner(*args, **kwargs):     # *args, **kwargs 万能接收参数
            start = time.time()
            ret = f(*args, **kwargs)     # *args, **kwargs 万能传入参数
            end = time.time()
            print(end-start)
            return ret
        return inner
    
    @timmer
    def func(a, b): 
        print(a, b)
        time.sleep(1)
        return '我在等待一秒钟'
    
    @timmer         
    def func1(a):   
        print(a)
        time.sleep(1)
        return '我在等待一秒钟'
    
    print(func(1, 2))
    print(func1(1))

    四、装饰器固定模式

    1、装饰器这样我们就可以游刃有余的写:在被装饰函数之 前 、后 要做的功能了。

    2、固定模式如下:

    # 4.装饰器固定模式
    def wrapper(f):                     # 装饰器函数:wrapper   被装饰函数:f
        def inner(*args, **kwargs):     # 被装饰函数:inner == f
            # 在被装饰函数之 前 要做的功能
            ret = f(*args, **kwargs)
            # 在被装饰函数之 后 要做的功能
            return ret
        return inner
    
    @wrapper        # @装饰器函数,实际相当于:wrapper(fon)
    def fon(a):
        print('打酱油')
        return a
    
    r = fon('固定模式就是这样')          # 实际相当于调用:inner
    print(r)

     

    有没有装饰器都不会影响原函数的执行,只是能够对现有的进行 前后 扩展,是不是很有必要掌握好的技能呢?

    如有更多欢迎来QQ交流群:482713805

  • 相关阅读:
    AjaxPro对象参数传递
    SQLServer “无法对数据库'XX' 执行删除,因为它正用于复制”的解决方法
    sql server 查询某个表被哪些存储过程调用
    存储过程简单实例
    清理sqlserver 2012 日志文件
    从客户端(XXX)中检测到有潜在危险的Request.Form 值
    sqlserver无法在数据库上放置锁
    C#趋势图(highcharts插件)
    TFS 报错解决方案:tf400324
    checkbox勾选事件,JQ设置css,下拉框JQ选中
  • 原文地址:https://www.cnblogs.com/gsxl/p/12104996.html
Copyright © 2011-2022 走看看