Python 中修饰器

修饰器就是一个返回函数的高阶函数

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from functools import wraps

def log(func):
    #@wraps(func)   #如果不加这句,log返回wrapper,那么hack.__name__ 就是 wrapper.
    def wrapper(*args,**kwargs):
        print('call %s'% func.__name__)
        return func(*args,**kwargs)
    return wrapper

@log
def hack():
    print('hello world !!!')

print(hack.__name__)

如果decorator本身需要传入参数,那就需要编写一个返回decorator的高阶函数,写出来会更复杂。比如,要自定义log的文本

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

这个3层嵌套的decorator用法如下:

@log('execute')
def now():
    print('hello world!')

和两层嵌套的decorator相比,3层嵌套的效果是这样的:

>>> now = log('execute')(now)
Python 中修饰器_第1张图片
图片发自App

你可能感兴趣的:(Python 中修饰器)