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()函数。

  • 相关阅读:
    Rational Rose 2003 逆向工程转换C++ / VC++ 6.0源代码成UML类图
    用VC实现特定编辑框上对回车键响应
    22.职责链模式
    21.策略模式
    20.状态模式
    19.解释器模式
    18.备忘录模式
    17.中介者模式
    16.观察者模式
    15.迭代器模式
  • 原文地址:https://www.cnblogs.com/ahaii/p/6560032.html
Copyright © 2011-2022 走看看