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).执行函数以后,与装饰器的装饰先后顺序 相反

    作者:蓝月

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

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

  • 相关阅读:
    表单数据源控制器笔记
    方法汇总1
    Persistence.beans
    数据库外键理解
    SQL语句缺少
    树型结构需要绑定的字段
    模型绑定替换
    乱码
    表单的验证:客户端验证和服务器端验证
    表单
  • 原文地址:https://www.cnblogs.com/viplanyue/p/12700605.html
Copyright © 2011-2022 走看看