如何为所有类型的方法/函数使用相同的python装饰器?

时间:2012-02-20 16:18:14

标签: python decorator python-2.7

如果我有这样的话:

class SomeClass(object):

    @classmethod
    @some_decorator
    def foo(cls, **kwargs):
        pass

    @some_decorator
    def bar(self, **kwargs):
        pass

    @staticmethod
    @some_decorator
    def bar(**kwargs):
        pass

@some_decorator
def function_outside_class(**kwargs):
    pass

我应该如何制作@some_decorator,使其适用于上面列出的每种类型的功能?基本上现在我需要装饰器在方法之后运行一些代码(关闭SQLAlchemy会话)。我在使用@staticmethod

完全装饰的方法时使任何装饰器工作时遇到了问题

1 个答案:

答案 0 :(得分:2)

只要您按照帖子中给出的顺序保留装饰器,装饰器的直接实现应该可以正常工作:

def some_decorator(func):
    @functools.wraps(func)
    def decorated(*args, **kwargs):
        res = func(*args, **kwargs)
        # Your code here
        return res
    return decorated

请注意,你不能这样做。

@some_decorator
@staticmethod
def bar(**kwargs):
    pass

因为staticmethod对象本身不可调用。