zoukankan      html  css  js  c++  java
  • python之装饰器

    由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。

    >>> def now():
         print '2016-06-02'
    >>> f = now
    >>> f()
    2016-06-02

    现在希望在函数调用前自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。

    所以,我们要定义一个能打印日志的decorator,可以定义如下:

    def log(func):    #func 调用的函数

        def inner(*args, **kw):  #原函数带入的参数

            print 'I am a log %s():' % func.__name__   # func.__name__函数名

            return func(*args, **kw)

        return inner

     

    上面的log,因为它是一个装饰器,所以接受一个函数作为参数,并返回一个函数。我们要借助Python的@语法,把装饰器置于函数的定义处:

    @log

    def now():

    print '2016-06-02'

     

     

    >>> now()

    @log放到now()函数的定义处,相当于执行了语句:

    now = log(now)

    由于log()是一个装饰器,返回一个函数,所以,原来的now()函数仍然存在,只是现在同名的now变量指向了新的函数,于是调用now()将执行新函数,即在log()函数中返回的wrapper()函数。

    inner()函数的参数定义是(*args, **kw),因此,inner()函数可以接受任意参数的调用。在inner()函数内,首先打印日志,再紧接着调用原始函数。

     

    装饰器通常用于判断权限

  • 相关阅读:
    Windows Python+Eclipse环境配置
    infobright系列二:数据迁移
    infobright系列一:源码安装infobright
    autotools归纳
    Atlas系列一:Atlas功能特点FAQ
    C#反射技术概念作用和要点
    .net获取本机公网IP代码
    Java泛型-类型擦除
    现在就使用HTML5的十大原因
    让网页图片变灰色的三种方法
  • 原文地址:https://www.cnblogs.com/illn/p/5554648.html
Copyright © 2011-2022 走看看