一尘不染

Python装饰器作为静态方法

python

我正在尝试编写一个使用装饰器函数的python类,该装饰器函数需要实例状态的信息。这可以按预期工作,但是如果我将装饰器明确设为staticmetod,则会出现以下错误:

Traceback (most recent call last):
  File "tford.py", line 1, in <module>
    class TFord(object):
  File "tford.py", line 14, in TFord
    @ensure_black
TypeError: 'staticmethod' object is not callable

为什么?

这是代码:

class TFord(object):
    def __init__(self, color):
        self.color = color

    @staticmethod
    def ensure_black(func):
        def _aux(self, *args, **kwargs):
            if self.color == 'black':
                return func(*args, **kwargs)
            else:
                return None
        return _aux

    @ensure_black
    def get():
        return 'Here is your shiny new T-Ford'

if __name__ == '__main__':
    ford_red = TFord('red')
    ford_black = TFord('black')

    print ford_red.get()
    print ford_black.get()

而且,如果我只删除该行@staticmethod,一切都会正常,但是我不明白为什么。它不应该self作为第一个论点吗?


阅读 156

收藏
2020-12-20

共1个答案

一尘不染

这不是staticmethod应该使用的方式。
staticmethod对象是返回包装对象的描述符,因此它们仅在以身份访问时才起作用classname.staticmethodname。例

class A(object):
    @staticmethod
    def f():
        pass
print A.f
print A.__dict__["f"]

版画

<function f at 0x8af45dc>
<staticmethod object at 0x8aa6a94>

在的范围内A,您将始终获得后一个对象,该对象不可调用。

我强烈建议将装饰器移至模块作用域-
它似乎不属于类内部。如果您想将其保留在类中,请不要将其设置为staticmethod,而应将其简单地del放在类主体的末尾-在这种情况下,不应在类外部使用它。

2020-12-20