zoukankan      html  css  js  c++  java
  • python 装饰器-初识

    一、装饰器的形成过程

    1.函数无参数,无返回值

    import time
    
    
    def f1():   # 无参数,无返回值
        time.sleep(1)
        print("Hello, World!")
    
    
    def timer(f):   # f 是函数名
        def inner():    # 闭包
            start = time.time()
            f()
            end = time.time()
            total = end - start
            print(total)
        return inner
    
    
    f1 = timer(f1)      # 调用timer()函数,获取inner函数名指向的内存地址的返回值
    f1()

    2.函数有返回值,无参数

    import time
    
    
    def f1():   # 无参数,有返回值
        time.sleep(1)
        print("Hello, World!")
        return True
    
    
    def timer(f):   # f 是函数名
        def inner():    # 闭包
            start = time.time()
            ret = f()
            end = time.time()
            total = end - start
            print(total)
            return ret
        return inner
    
    
    f1 = timer(f1)      # 调用timer()函数,获取inner函数名指向的内存地址的返回值
    ret = f1()
    print(ret)

    3.函数有参数,有返回值

    def f1(a, **kwargs):   # 参数,返回值 *args和**args可以组成任意类型的参数
        time.sleep(1)
        print("Hello, World!", a, kwargs)
        return "abc"
    
    
    def timer(f):   # f 是函数名
        def inner(*args, **kwargs):    # 闭包
            start = time.time()
            ret = f(*args, **kwargs)
            end = time.time()
            total = end - start
            print(total)
            return ret
        return inner
    
    
    f1 = timer(f1)      # 调用timer()函数,获取inner函数名指向的内存地址的返回值
    ret = f1(1, name='tom')
    print(ret)

    二、装饰器的作用

    在不改变函数调用方式的情况下,在原函数的前后添加功能

    三、开放封闭原则

    开放:对扩展开放

    封闭:对修改封闭

    这是装饰器开发的原则

    四、语法糖

    简化代码

    import time
    
    
    def timer(f):   # f 是函数名
        def inner(*args, **kwargs):    # 闭包
            start = time.time()
            ret = f(*args, **kwargs)
            end = time.time()
            total = end - start
            print(total)
            return ret
        return inner
    
    
    @timer  # f1 = timer(f1),语法糖简化代码
    def f1(a, **kwargs):   # 参数,返回值 *args和**args可以组成任意类型的参数
        time.sleep(1)
        print("Hello, World!", a, kwargs)
        return "abc"
    
    
    ret = f1(1, name='tom')
    print(ret)

    五、装饰器的固定模式

    def wrapper(f):     # 装饰器 
        def inner(*args, **kwargs):
            # 在原函数(被装饰)前增加的功能
            ret = f(*args, **kwargs)    # 被装饰的函数
            # 在原函数(被装饰)后增加的功能
            return ret
        return inner
    
    
    @wrapper    # f1 = wrapper(f1)
    def f1(*args, **kwargs):
        print("Hello World!", args, kwargs)
        return args
    
    
    ret = f1('a', 'b', name='tom')      # f1指向的内存地址是inner指向的内存地址
    print(ret)

    巧记:1.先定义函数,再定义内部函数,返回内部函数的函数名

       2.内部函数内放被装饰的函数,传进被装饰函数的函数名

       3.被装饰的参数需要参数和返回值

    PS:参数的传递:接收聚合,调用打散

  • 相关阅读:
    flume 安装过程记录
    hive 动态分区插入
    hive 数据导入
    scala 学习笔记
    hive 日志
    Linux下设置和查看环境变量
    数据结构(4):图解递归调用机制
    使用数据结构栈实现表达式计算器
    数据结构(3):java使用数组模拟堆栈
    使用Vue和Element-ui的cdn模式临摹一个后台框架
  • 原文地址:https://www.cnblogs.com/wt7018/p/10828587.html
Copyright © 2011-2022 走看看