使方法成为 @staticmethod 用于文档目的?

Making a method a @staticmethod for documentation purposes?

我有时会使用 @staticmethod 装饰器来表示一个方法只依赖于它的参数而不触及实例(即 self)。我的目的是记录该方法确实是 pure function。这种静态方法的用法是否可取,或者我应该只在文档字符串中包含此类信息?

我知道 @staticmethod 做什么(更改签名,...)。我对它的机制不感兴趣。我想知道在根本不需要 self 的任何时候将方法设为静态是否是一种好的风格(基本上作为该事实的文档)。

如果你确实有一个静态方法,肯定会使用@staticmethod

@staticmethod 不仅仅是记录您的意图,它实际上改变了您的方法的行为。它停止绑定到实例的方法的第一个变量。

@staticmethod:

>>> class Foo(object):
...     def __init__(self, name):
...         self.name = name
...     @staticmethod
...     def bar(argument):
...         print argument
...
>>> foo = Foo('foo')
>>> foo.bar(1)
1

没有@staticmethod:

>>> class Foo(object):
...     def __init__(self, name):
...         self.name = name
...     def bar(argument):
...         print argument
...
>>> foo = Foo('foo')
>>> foo.bar(1) # the 'argument' variable is bound to the instance, so you're now sending two arguments to this method
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: bar() takes exactly 1 argument (2 given)

如果您拥有的是静态方法,则应在方法签名中使用 @staticmethod 并省略 self。 如果你不使用 @staticmethod 必须 (按照惯例)在方法签名中使用 self,而不是在方法的任何地方使用它 - 但为什么会你这样做吗?

编辑: 出于某种原因,我错过了关于纯函数的部分。静态方法 != 纯函数,你可以有不纯的静态方法(例如,包含打印语句或改变作为参数发送的列表)和纯实例方法(它们使用但不改变值实例属性 进一步编辑:仅当相关实例属性不可变时)。 @staticmethod 是静态方法几乎必不可少的代码行,但文档很差,无法表示方法的纯度。如果纯度是你想要专门记录的,那么你是对的,你应该把它放在文档字符串中。

另一个要考虑的问题是 - 为什么要使用静态方法而不是未绑定到对象的函数?如果函数必须是一个方法,那么它真的应该是一个静态方法。但在 Python 中,您最好将其作为一个独立的函数。