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

作者:C Wong 时间:2022-01-30 21:57:32 

装饰器对与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函数

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

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


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
0
投稿

猜你喜欢

  • Python实现七彩蟒蛇绘制实例代码

    2022-04-28 20:03:37
  • 行转列之SQL SERVER PIVOT与用法详解

    2024-01-28 10:41:37
  • 详解Python单元测试的两种写法

    2023-02-13 06:04:20
  • SqlServer数据库提示 “tempdb” 的日志已满 问题解决方案

    2024-01-28 10:39:47
  • JavaScript实现省市县三级级联特效

    2024-04-18 10:55:56
  • 属性与 @property 方法让你的python更高效

    2023-02-02 08:20:18
  • 利用Python实现绘制3D爱心的代码分享

    2021-03-30 23:25:12
  • Python环境下安装使用异步任务队列包Celery的基础教程

    2023-08-23 23:06:48
  • ASP程序开发注意的安全事项

    2010-05-03 10:55:00
  • Django修改app名称和数据表迁移方案实现

    2022-12-14 17:09:11
  • CASE表达式实现基于条件逻辑来返回一个值

    2024-01-19 23:18:45
  • Matlab中关于argmax、argmin函数的使用解读

    2023-06-27 20:36:53
  • jquery动态遍历Json对象的属性和值的方法

    2024-06-09 00:53:36
  • PHP实现的简单排列组合算法应用示例

    2023-11-18 16:28:40
  • python pandas dataframe 按列或者按行合并的方法

    2022-04-15 13:25:19
  • Python将文字转成语音并读出来的实例详解

    2021-11-08 21:23:34
  • Vue+Django项目部署详解

    2024-04-30 10:20:16
  • Python实现捕获异常发生的文件和具体行数

    2023-12-11 18:14:52
  • php 无限级 SelectTree 类

    2024-05-13 09:25:03
  • 安装Anaconda3及使用Jupyter的方法

    2022-04-13 18:15:21
  • asp之家 网络编程 m.aspxhome.com