使方法成为 @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 中,您最好将其作为一个独立的函数。
我有时会使用 @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 中,您最好将其作为一个独立的函数。