def log(func):
def wrapper(*args, **kwargs):
print('%s function start' % func.__name__)
result = func(*args, **kwargs)
print('%s function end' % func.__name__)
return result
return wrapper
@log
def say1(words):
print(words)
@log
def say2(words):
return words
say1('hello') # 此时say1和say2指向的是wrapper函数(__name__为'wrapper')
data = say2('hello')
print(data)
# 均打印:
# say function start
# hello
# say function end
class log(object):
def __init__(self, func):
self._func = func
def __call__(self, *args, **kwargs):
print('start')
return self._func(*args, **kwargs)
@log
def say(words):
return words
res = say('hello')
print(res)
res = say('world')
print(res)
# 打印:
# start
# hello
# start
# world
在装饰阶段,_init_ 函数执行,在被装饰的方法被调用的时候,_call_ 执行。
带参数的类式装饰器
class log(object):
def __init__(self, level):
self._level = level
def __call__(self, func):
print('__call__()方法执行')
def decorator(*args, **kwargs):
if self._level == 'warning':
print('warning! function was called')
elif self._level == 'error':
print('error! function was called')
return func(*args, **kwargs)
return decorator
@log('error')
def say(words):
return words
res = say('hello')
print(res)
res = say('world')
print(res)
# 打印:
# __call__()方法执行
# error! function was called
# hello
# error! function was called
# world