我理解的Python函数装饰器(可能有误),是用于给函数添加副作用和修改返回值的。现在,装饰器可以通过放置在要被装饰的函数定义上方或者赋值来添加。以下是一个小例子:
def print_args_decor(function):
def wrapper(*args, **kwargs):
print 'Arguments:', args, kwargs # Added side-effect
return function(*args, **kwargs)*5 # Modified return value
return wrapper
@print_args_decor
def do_stuff(strg, n=10):
"""Repeats strg a few times."""
return strg * n
new_decorated_func = print_args_decor(do_stuff) # Decoration by assignment
print do_stuff('a', 2) # Output: aaaaaaaaaa
现在,如何将修饰器附加到在其他地方定义的函数上,最好保留原始函数的名称和文档字符串(就像 functools.wraps
一样)?例如,我从 Python 的 math 模块中导入 sqrt()
函数,并想要对其进行修饰,我该怎么做?
from functools import wraps
from math import sqrt
def print_args_decor(function):
@wraps(function)
def wrapper(*args, **kwargs):
print 'Arguments:', args, kwargs # Added side-effect
return function(*args, **kwargs)*5 # Modified return value
return wrapper
# Decorate the sqrt() function from math module somehow
@print_args_decor #???
sqrt #???
print sqrt(9)
# Output:
# Arguments: ([9],) {}
# 15 # <--- sqrt(9)*5
那么在类内之后如何装饰方法?对于装饰类本身呢?
@decorator
语法只是将被修饰的对象传递给装饰器可调用对象,并用结果替换名称。因此,对于一个类来说,这只是ClassName = decorator(ClassName)
。 - Martijn Pieters__func__
属性获取原始函数:ClassName.function_name = decorator(ClassName.function_name.__func__)
。 - Martijn Pieters