Python函数-装饰器

Posted Sch01aR#

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python函数-装饰器相关的知识,希望对你有一定的参考价值。

装饰器通过函数来定义,用来装饰函数

装饰器的结构为高阶函数和内嵌函数

装饰器不改变被装饰函数的源代码和运行方式

如何实现这个效果呢?

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

import time

def timer(func): #定义一个装饰器
    def deco():
        start_time = time.time()
        func()
        stop_time = time.time()
        print("the run time is %s"%(stop_time-start_time))
    return deco

def test1():
    time.sleep(3)
    print(\'in the test1\')

test1 = timer(test1)
test1()

既没有改变被装饰函数的源代码,也没有改变它的运行方式

运行

这么写有些复杂,可以直接在函数前调用装饰器

调用装饰器的格式为:@装饰器名

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

import time

def timer(func): #定义一个装饰器
    def deco():
        start_time = time.time()
        func()
        stop_time = time.time()
        print("the run time is %s"%(stop_time-start_time))
    return deco

@timer #相当于test1 = timer(test1)
def test1():
    time.sleep(3)
    print(\'in the test1\')

test1()

运行

执行过程:

先走test1函数前的装饰器timer(),然后在timer()函数内走函数deco(),记录下start_time,然后deco()函数调用函数test1(),然后执行完函数test1()后,记录下stop_time,最后计算时间并打印

虽然装饰器不会修改被装饰函数的源代码和运行方式,但是不能直接返回函数的返回值

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

import time

def timer(func): #定义一个装饰器
    def deco():
        start_time = time.time()
        func()
        stop_time = time.time()
        print("the run time is %s"%(stop_time-start_time))
    return deco

@timer #test1 = timer(test1)
def test1():
    time.sleep(3)
    print(\'in the test1\')
    return "test1"

print(test1())

运行结果

打印的返回值为None,因为这个返回值为装饰器里的内嵌函数的返回值

如果需要打印被装饰函数的返回值的话,需要在装饰器里的内嵌函数中返回

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

import time

def timer(func): #定义一个装饰器
    def doc():
        start_time = time.time()
        func()
        stop_time = time.time()
        print("the run time is %s"%(stop_time-start_time))
        return func()
    return doc

@timer #test1 = timer(test1)
def test1():
    time.sleep(3)
    print(\'in the test1\')
    return "test1"

print(test1())

运行结果

 

以上是关于Python函数-装饰器的主要内容,如果未能解决你的问题,请参考以下文章

python 装饰器

[TimLinux] Python 装饰器

python装饰器

python函数装饰器

Python装饰器

python装饰器