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)
     
  • 相关阅读:
    焦虑:都说程序员是青春饭,那么程序员老了何去何从呢?
    数据库查询语句优化,mysql优化,join语句优化附带YYC松鼠短视频系统详细demo效果
    IT行业:为什么大部分人都不认可php语言呢?
    拇指赚点赞无加密源码发布分享仅供学习
    区块鼠区块养殖系统源码无加密源码发布分享仅供学习
    3月1日晚突遭大量攻击,网站/APP突然遭遇黑客攻击时该如何应对?
    ThinkPHP内核全行业小程序运营管理系统源码免费分享下载
    2020年不管打工还是创业,居然还有人相信读书无用论?
    在IT界,应聘企业去上班如果老板一点不懂技术那绝对是作茧自缚
    看了这篇文章你还不懂傅里叶变换,那我就真没办法呢!
  • 原文地址:https://www.cnblogs.com/pywen/p/14950018.html
Copyright © 2011-2022 走看看