zoukankan      html  css  js  c++  java
  • Python装饰器用法

    一.装饰器的概念
    1.装饰器的本质是函数
    2.原则:
    1.不能修改被装饰函数的源代码
    2.不能修改被装饰函数的调用方式
    3.装饰器对所装饰的函数是透明

    装饰器 = 高阶函数+嵌套函数(不一定有)+闭包函数
    高阶函数:将一个函数作为变量传递给另一个函数 =====> 函数即变量



    1.首先我们要了解下函数的引用
    def test():
    print("in the test")


    # # 调用方式一
    # test()


    # 调用方式二
    a = test # 将test函数的内存地址给了a,引用的是test的内存地址,然后在调用
    a()

    ===========================================================================

    2.闭包函数
    """
    闭包函数满足的条件:
    1.闭包函数必须有内嵌函数
    2.内嵌函数要用到上一级函数当中的变量
    3.闭包函数必须返回内嵌函数
    """
    def demo(a, b):
    def func(x):
    print(a * x + b)
    return a * x + b

    return func

    a = demo(1, 2) # a = demo(1,2) 运行demo函数,最终结果就是拿到demo函数返回的func内存地址给了a这个变量
    a(5) # a就是func函数
     
    ===========================================================================
    
    
    # 简单高阶函数一:
    def test():
        print("in the test_case")


    def test_1(func): # 高阶函数
    print(func) # 打印函数的内存地址
    func()


    test_1(test)



    # 简单的高阶函数二
    def test():
    time.sleep(2)
    print("in the test_mycar")


    def demo(func):
    start_time = time.time()
    func()
    stoptime = time.time()
    print("运行的时间是{}".format(stoptime - start_time))
    return func # 必须返回一个函数(加了return是一个装饰器,没有加就是一个高阶函数)


    # 调用方法1
    # demo(test)


    # 调用方法2
    test_01 = demo(test) # test 就是demo函数返回的func内存地址
    test_01()

    ===========================================================================
    # 复杂的高阶函数

    import time

    def timer(func): # ===>timer 是一个高阶函数
    def demo():
    start_time = time.time()
    func()
    stoptime = time.time()
    print("运行的时间是{}".format(stoptime - start_time))

    return demo # 必须返回一个函数,返回的是函数的内存地址


    def test_2():
    time.sleep(2)
    print("我是被装饰的函数")


    test_2 = timer(test_2) # test_2 和demo是一样的内存地址
    test_2() # 实际就是demo函数在调用

    ===========================================================================


    # 简单装饰器
    import time

    def timer(func): # ===>timer 是一个高阶函数
    def demo():
    start_time = time.time()
    func()
    stoptime = time.time()
    print("运行的时间是{}".format(stoptime - start_time))

    return demo # 必须返回一个函数,返回的是函数的内存地址


    @timer
    def test_2():
    time.sleep(2)
    print("我是被装饰的函数")


    test_2()
    ===========================================================================

    # 有参数的装饰器

    import time

    def timer(func):
    def demo(*args, **kwargs):
    start_time = time.time()
    func(*args, **kwargs)
    stoptime = time.time()
    print("运行的时间是{}".format(stoptime - start_time))

    return demo


    @timer
    def test_2():
    time.sleep(2)
    print("我是被装饰的函数")


    @timer
    def test_03(x, y):
    time.sleep(2)
    print(x)
    print(y)


    test_2()
    test_03(1, 4)
     
  • 相关阅读:
    Upgrading to MySQL 5.7---focusing on temporal types
    mysqldump备份7
    mysqldump原理5
    mysqldump原理4
    mysqldump原理3
    mysqldump原理2
    mysqldump原理1
    MySQL复制中slave延迟监控
    赵浮云的blog 关注IT运维,开源硬件。
    爱维帮---LVS
  • 原文地址:https://www.cnblogs.com/pywen/p/14950018.html
Copyright © 2011-2022 走看看