如何在类中将staticmethod作为装饰器在python中进行?

时间:2017-02-26 04:37:16

标签: python decorator static-methods

我在python中创建装饰器时遇到了一个有趣的场景。以下是我的代码: -

class RelationShipSearchMgr(object):

    @staticmethod
    def user_arg_required(obj_func):
        def _inner_func(**kwargs):
            if "obj_user" not in kwargs:
                raise Exception("required argument obj_user missing")

            return obj_func(*tupargs, **kwargs)

        return _inner_func

    @staticmethod
    @user_arg_required
    def find_father(**search_params):
        return RelationShipSearchMgr.search(Relation.RELATION_FATHER, **search_params)

如上面的代码所示,我创建了一个装饰器(在类中是静态方法),它检查是否" obj_user"作为参数传递给修饰函数。我已经修饰了函数find_father,但我收到以下错误消息: - 'staticmethod' object is not callable

如何使用如上所示的静态实用方法,作为python中的装饰器?

提前致谢。

2 个答案:

答案 0 :(得分:2)

staticmethod描述符@staticmethod返回描述符对象而不是function。这就是为什么它会引发staticmethod' object is not callable

我的答案就是避免这样做。我不认为有必要使user_arg_required成为静态方法。

经过一番游戏之后,我发现如果您仍然想使用静态方法作为装饰器,那就有黑客攻击。

@staticmethod
@user_arg_required.__get__(0)
def find_father(**search_params):
    return RelationShipSearchMgr.search(Relation.RELATION_FATHER, **search_params)

此文档将告诉您什么是描述符。

https://docs.python.org/2/howto/descriptor.html

答案 1 :(得分:0)

在挖掘了一下之后,我发现staticmethod对象有__func__内部变量__func__,它存储了要执行的原始函数。

所以,以下解决方案对我有用: -

@staticmethod
@user_arg_required.__func__
def find_father(**search_params):
    return RelationShipSearchMgr.search(Relation.RELATION_FATHER, **search_params)