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

posted @ 2018-08-28 11:30  IT蓝月  阅读(123)  评论(0编辑  收藏  举报
Live2D