如果我有这样的话:
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
完全装饰的方法时使任何装饰器工作时遇到了问题答案 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
对象本身不可调用。