python装饰器decorator介绍

作者:junjie 时间:2021-12-18 10:56:25 

一、装饰器decorator

decorator设计模式允许动态地对现有的对象或函数包装以至于修改现有的职责和行为,简单地讲用来动态地扩展现有的功能。其实也就是其他语言中的AOP的概念,将对象或函数的真正功能也其他辅助的功能的分离。

二、Python中的decorator

python中的decorator通常为输入一个函数,经过装饰后返回另一个函数。  比较常用的功能一般使用decorator来实现,例如python自带的staticmethod和classmethod。

装饰器有两种形式:


@A
def foo():
    pass

相当于:


def foo():
    pass
foo = A(foo)

第二种为带参数的:


@A(arg)
def foo():
    pass

则相当于:


def foo():
    pass
foo = A(arg)(foo)

可以看出第一种的装饰器是个返回函数的函数,第二种的装饰器是个返回函数的函数的函数。

python中的decorator可以多个同时使用,如下:


@A
@B
@C
def f (): pass
   
# it is same as below
def f(): pass
f = A(B(C(f)))

三、Python中常用的decorator实例

decorator通常用来在执行前进行权限认证,日志记录,甚至修改传入参数,或者在执行后对返回结果进行预处理,甚至可以截断函数的执行等等。

实例1:


from functools import wraps
def logged(func):
    @wraps(func)
    def with_logging(*args, **kwargs):
        print (func.__name__() + " was called")
        return func(*args, **kwargs)
    return with_logging

@logged
def f(x):
   """does some math"""
   return x + x * x

print (f.__name__)  # prints 'f'
print (f.__doc__)   # prints 'does some math'

注意functools.wraps()函数的作用:调用经过装饰的函数,相当于调用一个新函数,那查看函数参数,注释,甚至函数名的时候,就只能看到装饰器的相关信息,被包装函数的信息被丢掉了。而wraps则可以帮你转移这些信息,参见http://stackoverflow.com/questions/308999/what-does-functools-wraps-do

标签:python,装饰器,decorator
0
投稿

猜你喜欢

  • 后台程序开发常用jQuery插件

    2010-04-06 12:11:00
  • mysql利用覆盖索引避免回表优化查询

    2024-01-12 21:34:11
  • java数据库开发之JDBC基础使用方法及实例详解

    2024-01-21 04:37:00
  • Python判断字符串是否为空和null方法实例

    2021-06-27 07:47:23
  • ActionScript3.0是革命性的

    2008-05-01 12:36:00
  • python 统计文件中的字符串数目示例

    2022-05-14 11:29:34
  • MySQL中的count(*) 和 count(1) 区别性能对比分析

    2024-01-24 03:12:51
  • 使用TensorFlow直接获取处理MNIST数据方式

    2022-12-16 22:35:49
  • Python 虚拟环境迁移到其他电脑的实现

    2023-04-16 19:08:13
  • JDBC数据库连接过程及驱动加载与设计模式详解

    2024-01-27 06:46:47
  • javascript替换已有元素replaceChild()使用介绍

    2024-04-10 13:55:08
  • css中浮动思考与小结

    2008-10-30 11:57:00
  • SQL Server 2000/2005/2008删除或压缩数据库日志的方法

    2024-01-20 15:56:15
  • Script 元素 type 属性的妙用

    2011-03-07 16:13:00
  • PL/SQL编程经验小结开发者网络Oracle

    2010-07-18 13:27:00
  • SQL Server 2012 安装与启动图文教程

    2024-01-27 08:33:35
  • python 如何对Series中的每一个数据做运算

    2023-11-19 23:33:07
  • html注释所引起的一系列问题

    2008-11-04 13:23:00
  • linux实现mysql数据库每天自动备份定时备份

    2024-01-20 11:58:53
  • js仿googl拖拽效果

    2007-09-29 13:16:00
  • asp之家 网络编程 m.aspxhome.com