python装饰器decorator介绍

yipeiwu_com5年前Python基础

一、装饰器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可视化mhd格式和raw格式的医学图像并保存的方法

Python可视化mhd格式和raw格式的医学图像并保存的方法

mhd格式的文件里面包含的是raw图像的一些头信息,比如图片大小,拍摄日期等等,那么如何可视化图像呢? import cv2 import SimpleITK as sitk imp...

mysql 之通过配置文件链接数据库

mysql 之通过配置文件链接数据库 配置文件jdbc.properties ##MySQL driver=com.mysql.jdbc.Driver url=jdbc\:mysql...

python3.5实现socket通讯示例(TCP)

python3.5实现socket通讯示例(TCP)

TCP连接: tcp是面向连接的一个协议,意味着,客户端和服务器开发发送数据之前,需要先握手创建一个TCP连接。TCP连接的一端与客户端套接字相互联系,另一端与服务器套接字相联系。当创建...

使用Python制作简单的小程序IP查看器功能

使用Python制作简单的小程序IP查看器功能

前言 说实话,查看电脑的IP,也挺无聊的,但是够简单,所以就从这里开始吧。IP地址在操作系统里就可以直接查看。但是除了IP地址,我们也想通过IP获取地理地址和网络运营商情况。IP地址和地...

解决Django 在ForeignKey中出现 non-nullable field错误的问题

在django的model中建立了如下的类 class UserType(models.Model): name = models.CharField(max_length=40,...