Python:装饰的静态方法接收非

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

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

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

# outputs False

print callable(Foo.bar) 
# outputs True

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

@staticmethod
def function():
    return

print callable(function) 
# outputs False

那么这是实现静态方法装饰器的一个真正的bug,和/或是否有任何简单的解决方法? 我确实想过编写一个装饰器来设置一个__call__属性,但我不知道如何实现callable ,所以我无法评估这种方法的成功。


方法是功能。 但staticmethod对象不是。 他们的描述,所以有额外的魔力,让你可调用的,当你访问它Cls.static_method ,但是当你使用这个魔法不能隐瞒任何事情(即传递给装饰) static_method的体内Cls 。 你无法解决这个问题,至少不够干净。 一个更简单的解决方案是重新排序装饰器,使staticmethod方法最后得到应用 - 即把它放在顶部,高于所有其他装饰器。


那么,无论你是否认为它是一个错误,它的记录:

静态方法对象提供了一种方法来克服上述功能对象到方法对象的转换。 静态方法对象是任何其他对象的包装器,通常是用户定义的方法对象。 当从一个类或一个类实例中检索静态方法对象时,实际返回的对象就是被包装的对象,它不受任何进一步转换。 静态方法对象本身不可调用,尽管它们通常包装的对象是。 静态方法对象由内置的staticmethod()构造函数创建。


我写了自己的可调用的staticmethod的实现,这似乎很好地解决了这个问题。

class staticmethod(object):
    """Make @staticmethods play nice with @memoize."""

    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        """Call the static method with no instance."""
        return self.func(*args, **kwargs)

这不使用描述符协议,因此它的内部行为与内置staticmethod行为非常不同,但实际上,它使得函数可以作为类属性,实例属性甚至函数属性进行调用(即,如果您已将类一个装饰函数,staticmethod的这个实现仍然允许你把你的静态方法作为包装函数的属性)。

链接地址: http://www.djcxy.com/p/54177.html

上一篇: Python: Decorated staticmethod receives non

下一篇: How was the syntax chosen for static methods in Python?