zoukankan      html  css  js  c++  java
  • 简单说明Python中的装饰器的用法

    简单说明Python中的装饰器的用法

    这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下
     

    装饰器对与Python新手以至于熟悉Python的人都是一个难理解, 难写的东西. 那么今天就分享一下我对Python 装饰器的理解

    所谓装饰器仅仅是一种语法糖, 可作用的对象可以是函数也可以是类, 装饰器本身是一个函数, 其主要工作方式就是将被装饰的类或者函数当作参数传递给装饰器函数, 比如定义如下装饰器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    import time
     
    def run_time(func):
      def wrapper(*args, **kwargs):
        start = time.time()
        r = func(*args, **kwargs)
        print time.time() - start
        return r
      return wrapper

    我们用这个装饰器装饰一个test函数

    1
    2
    3
    @run_time
    def test():
      print "just a test"

    前面说过其实装饰器就是一个语法糖, 就是将被装饰的函数作为参数传递给装饰器函数, 所以上面可以展开为

    1
    test = run_time(test)

    装饰器将在解释器运行一开始就被加载, 从而将被装饰的函数将被展开成如上方式, 因为 run_time装饰器返回wrapper函数, 所以当调用test函数时其实就是对wrapper的调用

    如果你在Python shell下执行以上语句就会发现定义完test函数然后查看test时, shell所展示的是wrapper函数

    201542492457922.png (502×346)

    接下来说说如何编写带参数的装饰器, 大家如果细心的话就可以发现其实带参数的装饰器是经过调用"装饰器"函数返回的一个装饰器, 之所以装饰器上打引号是说明其实这个所谓的"装饰器"只不过是一个普通的函数, 但这个普通的函数返回一个装饰器, 可以参看下面例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import time
     
    def route(url):
      def decorator(func):
        func.__url__ = url
        return func
      return decorator
     
    @route(r"/")
    def index():
      return "Hi"

    大家可以发现在使用route装饰器时我们其实是调用了route函数, route函数返回一个decorator装饰器, 因为我们不需要在装饰器内运行函数, 所以不需要一个wrapper函数来收集参数.

    以上就是全部内容, 希望对装饰器一知半解的人有些许帮助

  • 相关阅读:
    spring boot 扫描不到自定义Controller
    SpringBoot+Maven多模块项目(创建、依赖、打包可执行jar包部署测试)完整流程
    spring boot 中使用 jpa以及jpa介绍
    java8 快速实现List转map 、分组、过滤等操作
    Mysql 创建函数出现This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA
    Spring mvc @initBinder 类型转化器的使用
    @RequestMapping 和@ResponseBody 和 @RequestBody和@PathVariable 注解 注解用法
    ssm的自动类型转换器
    如果将get请求转换成post请求
    如何将post请求转换成put和delete请求
  • 原文地址:https://www.cnblogs.com/weiman3389/p/6047101.html
Copyright © 2011-2022 走看看