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

如何对所有类型的方法/函数使用相同的python装饰器?,python,decorator,python-2.7,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): pa

如果我有这样的东西:

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会话)。我很难让任何decorator使用@staticmethod修饰的allready方法,只要你保持decorator在文章中给出的顺序,decorator的直接实现就可以正常工作:

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
对象本身是不可调用的。

鉴于此粘贴,您是否愿意扩展不可调用的
staticmethod
对象?我相信你是对的,但我认为这种说法容易被误解@Marcin如果你想要的话,你需要调用Foo.Foo作为Foo.Foo()之类的方法。@Sven Marnach我是舒尔,我已经用这种方式试过了,准备好了,但我明天带着代码回到电脑上时会再次检查,也许我犯了一些愚蠢的错误。@SašaŠijak:我不确定你的意思-在这两种情况下,调用都很好。问题在于
staticmethod
对象。@Marcin:A
staticmethod
对象是一个描述符。当使用
Foo.Foo
检索它时,您将得到一个可调用的对象。当您作为
vars(Foo)[“Foo”]
访问它时,您将获得
staticmethod
对象本身。后者是不可调用的,这是外部装饰程序在最后一段代码中看到的。