我有时使用@staticmethod
装饰器来指示方法仅依赖于其参数而不触及实例(即self
)。我的目的是记录该方法确实是pure function。这种静态方法的使用是可取的还是我应该在docstring中包含这些信息?
我知道@staticmethod
做了什么(改变了签名,......)。我对它的机制不感兴趣。我想知道在任何时候他们根本不需要self
(基本上作为那个事实的文档)时使方法静态是否是好的风格。
答案 0 :(得分:4)
如果您确实有静态方法,请务必使用@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
,而不是在方法中的任何位置使用它 - 但为什么会这样做?
编辑:由于某种原因,我错过了关于纯函数的一点。静态方法!=纯函数,你可以使用不纯的静态方法(例如包含一个print语句或改变作为参数发送的列表)和实例纯方法(他们使用但不要改变实例属性的值进一步编辑:仅当有问题的实例属性是不可变的时)。 @staticmethod
是静态方法的近乎重要的代码行,但是文档很差,表示方法的纯度。如果纯度是你想要专门记录的,那么你是对的,你应该把它放在文档字符串中。
要考虑的另一个问题是 - 为什么有一个静态方法而不是一个未绑定到对象的函数?如果函数必须是一个方法,那么它确实应该是一个静态方法。但是在Python中,你可能最好只将它变成一个独立的函数。