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

猜你喜欢

  • 一个Access数据库数据传递的实例方法

    2008-11-28 16:24:00
  • 一些关于SQL2005+ASP.NET2.0的问题

    2007-09-23 13:01:00
  • IP地址正则表达式匹配方法

    2023-06-11 18:58:03
  • 仿豆瓣分页原型(Javascript版)

    2007-11-05 14:04:00
  • asp如何制作一个倒计时的程序?

    2010-06-29 21:25:00
  • 在任意字符集下正常显示网页的方法一

    2023-10-12 05:20:46
  • 微软的jQuery国际化插件

    2010-07-02 12:46:00
  • Javascript的错还是浏览器的问题——2009年为何显示为109年

    2009-01-11 18:19:00
  • Oracle SQL中实现indexOf和lastIndexOf功能的思路及代码

    2023-07-14 10:26:52
  • 加密SQL Anywhere 提升政府行业数据安全

    2008-12-03 15:25:00
  • Python批量删除txt文本指定行的思路与代码

    2021-05-12 22:49:45
  • Python开发微信公众平台的方法详解【基于weixin-knife】

    2023-03-09 12:05:43
  • 用ASP显示ACCESS数据库的的GIF图象

    2008-11-20 16:35:00
  • Oracle 数据库操作类

    2023-07-24 06:58:42
  • asp模板解析类模块(支持if,function,loop及解析缓存)

    2008-08-11 13:06:00
  • 浅谈Python批处理文件夹中的txt文件

    2023-03-17 22:58:28
  • python基础练习之几个简单的游戏

    2023-06-27 14:22:18
  • MYSQL教程:保证安全的备份MYSQL数据库的方法

    2010-03-03 17:12:00
  • php7 图形用户界面GUI 开发示例

    2023-09-12 03:16:50
  • PHPCMS的使用小结

    2023-11-20 20:19:47
  • asp之家 网络编程 m.aspxhome.com