我目前有以下使用 python 库的代码:
f = Foo(original_method, parameters)
我想增加 original_method,并让装饰器添加几行代码。我们将新的装饰方法称为decorated_method。最后我想要这样的东西:
f = Foo(decorated_method(original_method), parameters)
我的问题是:这可能吗?装饰器会是什么样子?我必须说我不能扩展 original_method,因为它是外部库的一部分。
编辑: original_method 未执行,仅作为参数传递给 Foo 。decorated_method 函数应该做一些日志记录并收集一些调用次数的统计信息。
稍后编辑:下面示例中的代码可以正常工作。我遇到了一些额外的问题,因为 original_method 有一些属性,所以这是最终代码:
def decorated_method(method):
def _reporter(*args, **kwargs):
addmetric('apicall', method.__name__)
return method(*args, **kwargs)
_reporter.original_method_attribute = method.original_method_attribute
return _reporter