将相同的方法传递给多个装饰器函数

时间:2015-02-04 01:14:30

标签: python python-3.x

我有一个像这样的方法

def update_count(target, value, initiator):
  target.count = len(target.collection)

但是,我有三个装饰函数我希望将它应用到

@event.listens_for(MyClass.collection, 'append')
@event.listens_for(MyClass.collection, 'remove')
@event.listens_for(MyClass.collection, 'set')

不是在每个装饰器下面复制整个方法,而是将update_count传递给每个event.listens_for装饰器方法作为参考的pythonic方法是什么?

1 个答案:

答案 0 :(得分:1)

最简单的:

@event.listens_for(MyClass.collection, 'append')
@event.listens_for(MyClass.collection, 'remove')
@event.listens_for(MyClass.collection, 'set')
def update_count(target, value, initiator):
    target.count = len(target.collection)

即,只需将装饰器一个接一个地放在def之前。

当然,这可能会导致开销,例如,如果每个装饰器将装饰的函数包装到另一个装饰函数中 - 但是如果你无法修复装饰器,那么你就无法避免这种开销。如果您可以更改装饰器,那么它的listen_multi变体会在一次吞吐中收听所有正在进行的事件,这无疑会提供更好的性能。