您导入
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'])



