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

 更新时间:2015年04月24日 09:24:22   作者:C Wong  
这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下

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

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

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函数

@run_time
def test():
  print "just a test"

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

test = run_time(test)

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

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

201542492457922.png (502×346)

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

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函数来收集参数.

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

相关文章

  • Python入门教程(二十八)Python中的JSON

    Python入门教程(二十八)Python中的JSON

    这篇文章主要介绍了Python入门教程(二十八)Python中的JSON,JSON 是用 JavaScript 对象表示法(JavaScript object notation)编写的文本,接下来我们就来学习一下
    2023-04-04
  • 关于Python中字符串的各种操作

    关于Python中字符串的各种操作

    本文将重点介绍Python字符串的各种常用方法,字符串是实际开发中经常用到的,所有熟练的掌握它的各种用法显得尤为重要。需要的朋友可以参考下面文章内容
    2021-09-09
  • 基于Python绘制世界疫情地图详解

    基于Python绘制世界疫情地图详解

    这篇文章主要介绍了如何使用Python绘制世界疫情地图,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • python实现微信每日一句自动发送给喜欢的人

    python实现微信每日一句自动发送给喜欢的人

    这篇文章主要为大家详细介绍了python实现微信每日一句自动发送给喜欢的人,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • Python数据结构与算法之链表,无序链表详解

    Python数据结构与算法之链表,无序链表详解

    这篇文章主要为大家详细介绍了Python数据结构与算法之链表,使用数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 使用python编写一个自动化部署工具

    使用python编写一个自动化部署工具

    这篇文章主要为大家详细介绍了如何使用python编写一个自动化部署工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • Python中类的继承代码实例

    Python中类的继承代码实例

    这篇文章主要介绍了Python中类的继承代码实例,本文直接给出代码及运行效果,需要的朋友可以参考下
    2014-10-10
  • Python+Pygame实战之泡泡游戏的实现

    Python+Pygame实战之泡泡游戏的实现

    这篇文章主要为大家介绍了如何利用Python中的Pygame模块实现泡泡游戏,文中的示例代码讲解详细,对我们学习Python游戏开发有一定帮助,需要的可以参考一下
    2022-07-07
  • Python字节串类型bytes及用法

    Python字节串类型bytes及用法

    这篇文章介绍了Python字节串类型bytes及用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • Python while、for、生成器、列表推导等语句的执行效率测试

    Python while、for、生成器、列表推导等语句的执行效率测试

    这篇文章主要介绍了Python while、for、生成器、列表推导等语句的执行效率测试,本文分别用两段程序测算出了各语句的执行效率,然后总结了什么情况下使用什么语句优先使用的语句等,需要的朋友可以参考下
    2015-06-06

最新评论