Python装饰器

栏目: Python · 发布时间: 7年前

内容简介:Python装饰器

@author StormMa

@date 2017-06-09

生命不息,奋斗不止!

开始之前

第一次接触 Python 的时候就是直接开始写一些爬虫或者是使用django写简单的web应用,但是最近想回头来看看Python中好玩的特性或者是基础。今天就来看一下装饰器的使用,其实感觉Python中的装饰器,有点类似于 Java 中的Aspect。就像你在一个方法中处理主要的业务逻辑,如果要想在处理业务逻辑之前打印一下日志的话,那么可以使用装饰器来装饰一下原函数,在此要说明一下,这里的装饰器和Java中的装饰器模式原理上还是相通的,但是Java中的装饰器模式是对对象的增强,如果使用Java装饰器模式实现,调用也要修改,但是Python中的这种实现之前的调用方式就不用做修改。

小例子

首先,我们用一个简单的示例来展示一下装饰器的真实面貌,就用我们之前说的增加一个打印日志的功能来装饰一个函数吧,我相信这个例子你一定可以看懂。

def log(func):
    def wrapper(*args, **kwargs):
        print("执行%s之前" % (func.__name__))
        func()
        print("执行%s之后" % (func.__name__))
    return wrapper
@log
def handle():
    print("处理主要的业务逻辑")

if __name__ == '__main__':
    handle()

上面的执行接口就是在打印handle里面的内容之前和之后分别打印了log中的日志内容。是不是就像是Java中Aspect的实现结果。我们来分析一下这个代码吧,这个代码比普通的函数调用就多了一个@log的annotation,其实@log翻译过来就是 handle = log(handle), 所以此时handle这个变量指向的不是原来的handle指向的函数,而是log返回的wrapper函数,我们原来的函数handle已经赋值给func这个变量了,此时的指向是这样的: handle –> wrapper, func –> 原来的handle指向的函数。那么此时调用handle,就是执行wrapper函数,wrapper函数中执行func就是原来的handler函数,这样就达到增强函数的效果了,其实也就是装饰器(这个名字叫的真不错,嘿哈)!其实注解这个语法就是把一个函数当做参数传递,然后回调函数的一个套路。

带参数的装饰器

如果我要在打印之前传递一个参数怎么办呢?

import time


def log(time):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print(time.title())
            print("执行%s之前" % (func.__name__))
            func()
            print("执行%s之后" % (func.__name__))
        return wrapper
    return decorator
@log(time=time.ctime())
def handle():
    print("处理主要的业务逻辑")

if __name__ == '__main__':
    handle()

读者可以根据我前面对那个小例子的分析来分析这段代码。假设你心里面已经有数了。只要我们知道@log(time=xxxx)这个东西到底怎么解释就解决了所有的疑惑。这次的@log(time=xxxx)解释成 handle = log(time=xxxx)(handle),handle指向的还是wrapper最后回调的还是func指向的原来的handle指向的函数,我觉得我们理解成log(time=xxxx)返回的是decorator,然后@log(time=xxxx)等价于@ decorator这个了,然后剩下就和上面那个例子一样了,如果对变量指向函数疑惑的同学,可以打印一下这两个例子中handle的 name 的属性,你会发现它们的结果是一样的都是wrapper,所以结果就是

Fri Jun  9 09:43:41 2017
执行handle之前
处理主要的业务逻辑
执行handle之后

本文来自我的个人站点: http://blog.stormma.me ,转载请注明出处!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

UNIX编程艺术

UNIX编程艺术

[美] Eric S. Raymond / 姜宏、何源、蔡晓骏 / 电子工业出版社 / 2012-8 / 99.00元

《UNIX编程艺术》主要介绍了Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验,由公认的Unix编程大师、开源运动领袖人物之一Eric S.Raymond倾力多年写作而成。包括Unix设计者在内的多位领域专家也为《UNIX编程艺术》贡献了宝贵的内容。《UNIX编程艺术》内容涉及社群文化、软件开发设计与实现,覆盖面广、内容深邃,完全展现了作者极其深厚的经验积累和领域智慧。一起来看看 《UNIX编程艺术》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具