Python:装饰的staticmethod接收不可调用的方法

Blu*_*ers 7 python decorator

我在Python中装饰静态方法时遇到了一些问题.我认为以下代码最能代表我的问题:

def decorator(func):
    print callable(func)
    return func

class Foo():
    @decorator
    @staticmethod
    def bar():
        return

# outputs False

print callable(Foo.bar) 
# outputs True
Run Code Online (Sandbox Code Playgroud)

这似乎是一个错误.我想它会产生,因为当方法Foo.bar传递给装饰器时,它是一个函数,而不是一个方法.这是我可以看到它不可调用的唯一原因,因为如果我们装饰一个标准函数,它就不可调用,如下所示.

@staticmethod
def function():
    return

print callable(function) 
# outputs False
Run Code Online (Sandbox Code Playgroud)

那么这是实现staticmethod装饰器的真正错误,和/或有任何简单的解决方法吗?我确实想过写一个装饰器来设置__call__属性,但我不知道如何callable实现,所以我无法衡量这种方法的成功.

小智 6

方法功能.但staticmethod对象不是.它们是描述符,因此有额外的魔法可以在你访问它时给你一个可调用的Cls.static_method,但是这个魔法在你使用(即传递给装饰器)static_method体内时无法隐藏任何东西Cls.你不能真正破解你的方式,至少不干净.一个更简单的解决方案是重新排序装饰器,使得staticmethod最后应用 - 即将其置于顶部,高于所有其他装饰器.