每个不使用 self 参数的方法都应该是静态类吗?

spe*_*cer 5 python static-methods

我只是想知道,因为偶尔我会遇到一些代码,我认为它们作为静态方法很好,但编码人员没有为某些方法放置装饰器。对于其他方法,它们已经就位。

那么...也许他们在使用或不使用静态方法装饰器时有什么想法?这种方法有什么优点吗?或者他们只是因为懒而省略了装饰器?

谢谢。

mgi*_*son 4

如果没有看到具体的代码,就很难给出通用的指导方针。我想说的是,一般来说,静态方法并没有得到社区的太多喜爱。您可以在许多帖子中看到这一点......例如:

...我们都知道静态方法有多么有限。(它们基本上是一个意外 - 早在 Python 2.2 时代,当我发明新式类和描述符时,我打算实现类方法,但一开始我不理解它们,并且意外地先实现了静态方法。然后它来不及删除它们并只提供类方法。)

我还工作过风格指南说“没有静态方法”的地方,相反,我更喜欢模块级方法。


基本同意上述建议。如果要使用静态方法,您应该准备好解释为什么需要该方法成为类命名空间而不是模块命名空间的一部分。根据具体情况,有些防御措施可能有意义,也可能没有意义:

  1. 你想重写子类中的方法
    • 根据我的经验,这种情况很少发生——而且通常当它确实发生时,你classmethod首先真的想要一个。
  2. 您认为该方法作为类的一部分在语义上更有意义。

好的,现在让我们谈谈没有self. Python3.x 改变了方法的行为。以下内容适用于 python3.x 但不适用于 python2.x...

>>> class Foo(object):
...   def static():
...     return 'bar'
... 
>>> print(Foo.static())
bar
Run Code Online (Sandbox Code Playgroud)

static但是,从实例调用是行不通的。相反,它会给出一条非常无用的错误消息:

>>> print(Foo().static())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: static() takes 0 positional arguments but 1 was given
Run Code Online (Sandbox Code Playgroud)

我想如果您有一个仅限 python3.x 的项目,并且您确实想阻止在实例上调用方法,但想在类上调用它... 1

否则,您可能应该将 a 放在@staticmethod那里,考虑该方法作为 a 是否会更好@classmethod,或者将该方法移至模块名称空间。它将增加该方法的可用性。它还将为阅读代码的人提供更多信息,以便他们知道如何调用/使用该方法。

1我实在想不出在什么情况下你会想要这样......