您导入sqrt
了模块,只需在自己的全局名称空间中将装饰器应用到其中即可:
sqrt = print_args_decor(sqrt)
这会将sqrt
模块名称空间中的名称设置为装饰器的结果。没有sqrt
最初在此模块中定义的要求。
使用functools.wraps()
装饰器保留功能元数据(例如名称和文档字符串)由装饰器决定。
在这方面装饰类没有什么不同:
ClassName = decorator(ClassName)
在Python 2上,对于 方法, 您需要小心获取原始的未绑定函数。最简单的方法是使用以下method.__func__
属性:
try:
# Python 2
ClassName.function_name = decorator(ClassName.function_name.__func__)
except AttributeError:
# Python 3
ClassName.function_name = decorator(ClassName.function_name)
我将上述内容包装在中,try...except
以使该模式可在Python版本之间使用。另一种选择是从类中获取函数对象__dict__
,以免描述符协议介入:
ClassName.function_name = decorator(ClassName.__dict__['function_name'])