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

    1.把一个函数作为另一个函数的参数

    注意函数 ly 中传的是另一个函数的地址,而不是对象

    import datetime, time
    
    def ly(fun):
        print(datetime.datetime.now())
        time.sleep(1)
        fun()
        print(datetime.datetime.now())
    
    def work():
        print("on working")
    
    if __name__ == '__main__':
        w = work
        ly(w)
    
    

    2.在函数内部定义函数

    import datetime, time
    
    def ly():
        print(datetime.datetime.now())
    
        def work():
            print("on working")
    
        work()
        time.sleep(1)
        print(datetime.datetime.now())
    
    if __name__ == '__main__':
        ly()
    
    

    注意:仅仅定义是不会执行的,需要手动执行

    3.闭包函数(一)

    import datetime, time
    
    
    def ly():
        info = "on working";
    
        print(datetime.datetime.now())
    
        def work():
            print(info)
    
        work()
        time.sleep(1)
        print(datetime.datetime.now())
    
    if __name__ == '__main__':
        ly()
    

    有区别吗?

    请看闭包函数的定义:

    (1).函数内部定义的函数 (2).包含对外部作用域而非全局作用域的引用

    注意闭包函数一般返回值,这里只是让读者理解闭包函数

    4.闭包函数(二)

    import datetime, time
    
    def ly(fun):
    
        print(datetime.datetime.now())
    
        fun()
        time.sleep(1)
    
        print(datetime.datetime.now())
    
    def work():
        info = "on working"
    
        def fun():
            print(info)
    
        return fun
    
    if __name__ == '__main__':
        print("---------------")
        w = work
        w()
        print("---------------")
        w = work()
        w()
        print("---------------")
        w = work
        f = w()
        f()
        print("---------------")

    注意:

    (1).第一部分并未任何输出,因为 w 只是 work()函数的一个地址,w() 只返回了 work内部函数fun()函数的地址

    (2).第二部分 w 得到的是 work() 函数执行后返回的内部函数fun()的地址,而 w() 便是fun()函数了

    (3).第三部分 结合 一二 部分很容易理解

    5.装饰器

    import datetime, time
    
    
    def ly(fun):
        def show():
            print(datetime.datetime.now())
            fun()
            time.sleep(1)
            print(datetime.datetime.now())
    
        return show
    
    @ly
    def work():
        info = "on working"
        print(info)
    
    if __name__ == '__main__':
        w = work
        w()

    定义:外部函数传入被装饰函数名,内部函数返回装饰函数名。

    特点:(1).不修改被装饰函数的调用方式 (2).不修改被装饰函数的源代码

    6.带指定参数的装饰器:

    import datetime, time
    
    def ly(fun):
        def show(name):
            print(datetime.datetime.now())
            fun(name)
            time.sleep(1)
            print(datetime.datetime.now())
    
        return show
    
    @ly
    def work(name):
        info = name + " is on working"
        print(info)
    
    if __name__ == '__main__':
        w = work
        w("the worker")

    注意装饰器替函带参数

    7.带不定参数装饰器:

    import datetime, time
    
    def ly(fun):
        def show(*args, **kwargs):
            print(datetime.datetime.now())
            fun(*args, **kwargs)
            time.sleep(1)
            print(datetime.datetime.now())
    
        return show
    
    @ly
    def work(name, age):
        info = age + " 岁的 " + name + " is on working"
        print(info)
    
    if __name__ == '__main__':
        w = work
        w("ly", "22")

    8.多个装饰器

    import datetime, time
    
    
    def ly(fun):
        def show():
            time.sleep(1)
            print("Decorator ly is work on " + str(datetime.datetime.now()))
            fun()
            time.sleep(1)
            print("Decorator ly is work on" + str(datetime.datetime.now()))
    
        return show
    
    def hh(fun):
        def show():
            time.sleep(1)
            print("Decorator hh is work on " + str(datetime.datetime.now()))
            fun()
            time.sleep(1)
            print("Decorator hh is work on" + str(datetime.datetime.now()))
    
        return show
    
    def tx(fun):
        def show():
            time.sleep(1)
            print("Decorator tx is work on " + str(datetime.datetime.now()))
            fun()
            time.sleep(1)
            print("Decorator tx is work on" + str(datetime.datetime.now()))
    
        return show
    
    @ly
    @hh
    @tx
    def work():
        info = "on working" + str(datetime.datetime.now())
        print(info)
    
    if __name__ == '__main__':
        w = work
        w()

    注意:

    从中我们可以看出多个装饰器的执行顺序是:

    (1).执行函数以前,同装饰器的 装饰先后 顺序

    (2).执行函数以后,与装饰器的装饰先后顺序 相反

    作者:蓝月

    -------------------------------------------

    个性签名:能我之人何其多,戒骄戒躁,脚踏实地地走好每一步

  • 相关阅读:
    两个半成品的ORM
    Mayberry小镇的管理 | 三种截然不同的领导风格 3M
    敏捷的目的(方向)错了以后……
    Error:java: Compilation failed: internal java compiler error
    java: -source 1.5 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符)
    看mybatis日志模块时涉及的动态代理
    看的顺眼的却Destination Unreachable
    如何下载钉钉回放视频
    不想学习时看一看会有帮助的,“但行好事,莫问前程”
    守护线程
  • 原文地址:https://www.cnblogs.com/viplanyue/p/12700605.html
Copyright © 2011-2022 走看看