语言-Python-decorator 装饰器

decorator

廖雪峰教程

装饰器本质上就是一个返回函数的高阶函数

简单的装饰器

def now():
     print('2015-3-25')

现在我们想要增强now()的功能,但是又不想更改now()函数的定义,这种在代码运行期间动态增加功能的方式,称为decorator

def log(func):#log就是一个decorator,能够接受一个函数,返回一个函数
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

现将log添加在now()前面

@log
def now():
    print('2015-3-25')

这里的@log相当于now = log(now) 输出为

call now():
2015-3-25

当装饰器本身需要参数输入需要三层嵌套 同时需要修改函数名字,否则有些设计签名的程序可能会出错

可以传递参数的装饰器

# This is our simple decorator
def simple_decorator(f):
    # This is the new function we're going to return
    # This function will be used in place of our original definition
    def wrapper():
        print "Entering Function"
        f()
        print "Exited Function"
    return wrapper
@simple_decorator
def hello():
    print "Hello World"
hello()

运⾏上述代码会输出以下结果: Entering Function Hello World Exited Function

我们这个时候可以外加一个函数用来传递参数

def decorator_factory(enter_message, exit_message):
    # We're going to return this decorator
    def simple_decorator(f):
        def wrapper():
            print enter_message
            f()
            print exit_message
        return wrapper
    return simple_decorator
@decorator_factory("Start", "End")
def hello():
    print "Hello World"

给我们的输出是: Start Hello World End

Table of Contents