如何对所有类型的方法/函数使用相同的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:Astaticmethod
对象是一个描述符。当使用Foo.Foo
检索它时,您将得到一个可调用的对象。当您作为vars(Foo)[“Foo”]
访问它时,您将获得staticmethod
对象本身。后者是不可调用的,这是外部装饰程序在最后一段代码中看到的。