【发布时间】:2011-03-17 21:21:50
【问题描述】:
我在装饰 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
那么这是实现 staticmethod 装饰器的真正错误,和/或有任何简单的解决方法吗?我确实想过写一个装饰器来分配一个__call__属性,但是我不知道callable是如何实现的,所以我无法衡量这种方法的成功。
【问题讨论】:
-
请注意,
staticmethod必须使用新样式类才能在实例上也可调用,因为它使用描述符。 -
要使其工作,只需更改描述符的顺序即可。