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

时间:2016-12-27 04:48:48

标签: python static-methods

我只是想知道,因为我偶尔会遇到一些代码,我认为它们可以作为静态方法使用,但编码器并没有为某些方法设置装饰器。对于其他方法,他们已经到位。

所以...当他们做或不使用静态方法装饰器时,他们可能会想到什么?这种方法有什么优势吗?或者他们只是因为省略装饰者而懒惰?

感谢。

1 个答案:

答案 0 :(得分:1)

如果没有看到具体的代码,很难给出一般指导原则。我会说,一般来说,静态方法并没有从社区中得到很多的爱。您可以在许多帖子中看到这一点......例如:

  

......我们都知道   静态方法有多么有限。 (他们基本上是一次事故 - 回来了   在我发明新式类的Python 2.2天   描述符,我的意思是实现类方法,但起初我没有   理解它们并首先意外地实现静态方法。   然后删除它们为时已晚,只提供类方法。)

我也曾在风格指南所说的地方工作过#14;没有静态方法"相反,更喜欢模块级方法。

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

  1. 您想要覆盖子类中的方法
    • 根据我的经验,这种情况很少发生 - 而且当 发生时,你真的想要classmethod
  2. 您认为该方法在语义上更有意义成为该类的一部分。
  3. 好的,现在让我们谈谈没有self的方法。 Python3.x改变了方法的行为。以下适用于python3.x但不适用于python2.x ...

    >>> class Foo(object):
    ...   def static():
    ...     return 'bar'
    ... 
    >>> print(Foo.static())
    bar
    

    但是,它无法从实例中调用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
    

    我想如果你有一个python3.x唯一的项目,你真的想阻止一个方法在一个实例上被调用,但是想在类上调用它... 1 。< / p>

    否则,您应该在其中放置一个@staticmethod,考虑该方法是否更好@classmethod或将方法移动到模块名称空间。它会增加该方法的可用性。它还会向阅读代码的人提供更多信息,以便他们知道如何调用/使用该方法。

    1 我真的无法想到你想要的情况......