码迷,mamicode.com
首页 > 编程语言 > 详细

python-装饰器

时间:2020-05-20 20:05:55      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:执行函数   执行   ret   这一   注解   理解   存在   UNC   场景   

python装饰器

Python装饰器看起来类似Java中的注解,然而和注解并不相同,不过同样能够实现面向切面编程。
想要理解Python中的装饰器,不得不先理解闭包(closure)这一概念。

  • 闭包
    在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。
    简单理解就是函数内部返回一个函数
def func():
    massage = "This is a closure message"

    # 这是内嵌函数
    def closure_func():
        # 可以使用外部函数的变量
        print(massage)
        pass
    return closure_func
    pass

# 获取一个闭包
closure = func()
# 输出信息:This is a closure message
closure()

massage 是一个局部变量,在func函数执行之后应该就不会存在了。但是嵌套函数引用了这个变量,将这个局部变量封闭在了嵌套函数中,这样就形成了一个闭包。

  • 装饰器的常用场景:
    1、引入日志
    2、函数执行时间统计
    3、执行函数前预备处理
    4、执行函数后清理功能
    5、权限校验等场景
    6、缓存
    7、事务处理
    这里模拟一个函数执行时间统计的场景
import time


def run_time(func):

    # 这是一个闭包
    def wapper(*args, **kwargs):
        # 开始时间
        start = time.time()
        func(*args, **kwargs)  # 运行函数
        # 结束时间
        end = time.time()
        print(f"run time:{end - start}")
        pass
    return wapper
    pass

# 这是要装饰的函数
@run_time
def func():
    time.sleep(2)
    pass

func()

结果:

run time:2.00065541267395
  • 带参数的装饰器
    和不带参数的装饰器基本一样的
import time


def run_time(func):

    # 这是一个闭包
    def wapper(*args, **kwargs):
        # 开始时间

        start = time.time()
        func(*args, **kwargs)  # 运行函数
        # 结束时间
        end = time.time()
        print(f"run time:{end - start}")
        pass
    return wapper
    pass

# 这是要装饰的函数
@run_time
def func(i):
    time.sleep(i)
    pass

func(3)

结果:

run time:3.0009799003601074

python-装饰器

标签:执行函数   执行   ret   这一   注解   理解   存在   UNC   场景   

原文地址:https://www.cnblogs.com/hziwei/p/12925715.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!