zoukankan      html  css  js  c++  java
  • Python的装饰器

    Python中装饰器语法纪录:

    装饰器的作用是,在不改变现有代码的结构的基础上,增加新的功能,号称'切面需求'。

    一个例子说明:

    业务中有一个msg()函数:

    def msg():
        print 'hello everyone'

    现由于需求有变,需要纪录每个函数的执行日志。

    正常的逻辑是:在原来的msg()中加入打印日志的内容,如下:

    def msg():
        logging.warn('%s is running' % func.__name__)
        print 'hello everyone'

     这样的话就改变了原函数结构。并且,如果函数非常多,就需要在每个函数中都添加。这样就造成了大量的雷同代码。

    为解决以上问题,python引入了装饰器语法:

    import logging
    
    def useLog(func):
        def wrapper():
            logging.warn("%s is running" % func.__name__)
            return func()   # 把 msg 当做参数传递进来时,执行func()就相当于执行msg()
        return wrapper
    
    def msg():
        print'hello everyone' #原函数不变
    
    msg = useLog(msg)  # 因为装饰器 useLog(msg) 返回的是函数对象 wrapper,这条语句相当于  msg = wrapper 
    msg()                   # 执行msg()就相当于执行 wrapper() 
    

    以上:定义了一个useLog()函数,该函数接受一个函数作为参数,内嵌wrapper()函数。

    msg=useLog(msg):

    useLog(msg)返回wrapper,即msg=wrapper。

    userLog()函数如下:

    def useLog(msg):
        def wrapper():
            logging.warn("%s is running" % func.__name__)
            return msg()   # 把 msg 当做参数传递进来时,执行func()就相当于执行msg()
        return wrapper

    msg():

    由于msg=wrapper,调用msg()函数即调用wrapper()函数。由于上面useLog(msg)的调用,wrapper()函数如下:

    def wrapper():
        logging.warn("%s is running" % func.__name__)
        return msg()

    即,执行logging方法打印运行日志,并且调用执行msg()函数。

  • 相关阅读:
    Cordova各个插件使用介绍系列(四)—canvas2ImagePlugin保存二维码到手机本地
    如何实现一个简单的MVVM框架
    2015年总结
    基于setTimeout制作滚动广告板
    (Frontend Newbie)JavaScript基础之函数
    (Frontend Newbie)JavaScript基础之常见数据类型
    (Frontend Newbie)Web三要素(三)
    (Frontend Newbie)Web三要素(二)
    (Frontend Newbie) Web三要素(一)
    (Frontend Newbie)Web简史
  • 原文地址:https://www.cnblogs.com/ahaii/p/6560032.html
Copyright © 2011-2022 走看看