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

    因为函数是一个对象,而且函数对象可以被复制给变量,所以通过变量也可以调用函数

    我们要在原代码上动态添加功能的方式就叫装饰器

    本质上,装饰器就是一个返回函数的告诫函数。我们现在定义一个打印体制的

    比如说我现在定义一个函数,实现以下的功能

    >>> def now():
    ...     print "12-23-11"
    ...

    上面的代码实现了打印日期的功能的功能

    我现在想给他添加新功能。但是不能改变函数now()函数的定义。

    我现在要给他添加一个打印日志的功能

    例子如下

    def log(func):
    def wrapper(*args,**kw):
    func()
    print 'call %s'%func.__name__
    return func(*args,**kw)
    return wrapper

    @log
    def now():
    print '2016-08-10'
    now()

    这里的@log放在最开始定义的函数now()处。相当于执行了now=log(now)。因为log()是一个装饰器,返回一个函数(对象),所以原来的now()函数仍然存在,只是在同名的now变量指向了新的函数,于是调用now()将执行新函数。即在log()函数中返回的wrapper()函数,也就是说调用now()函数执行wrapper()函数

    上面我们在装饰器中定义了参数,但是我们没有传入参数。如果装饰器内需要传入参数的话。则这么写:

    def log(text):
    def decorator(func):
    def wrapper(*args, **kw):
    print '%s %s():' % (text, func.__name__)
    return func(*args, **kw)
    return wrapper
    return decorator

    @log('hello')
    def now():
    print '2016-08-10'

    now()

    输出内容为
    hello now():
    2016-08-10

    这里自定义log的文本

  • 相关阅读:
    浅尝《Windows核心编程》之 等待函数
    linux 下 解压rar的过程
    一些多线程编程的例子(转)
    js数组操作《转》
    缩略图片处理<收藏>
    .net 框架
    详解NeatUpload上传控件的使用
    NHibernate工具
    xml xpath语法《转》
    C#事务技术
  • 原文地址:https://www.cnblogs.com/smail-bao/p/5730285.html
Copyright © 2011-2022 走看看