【问题标题】:python: When to use static method over class method?python:何时使用静态方法而不是类方法?
【发布时间】:2015-06-19 07:53:54
【问题描述】:

根据我的阅读,类方法与静态方法基本相同,但有一些例外,但具有提供类指针的优势。

因此,如果在类中定义了非实例方法,是否真的有任何理由使用静态方法而不是类方法?

编辑:因为你们中的一些人很快就会将此视为与另一个问题的重复。这不是关于类和静态方法之间区别的问题。而是在绝大多数情况下,当它们的功能重叠时,如何在两者之间做出决定是一个问题。

编辑#2:我问的原因是我正在重构其他人的一些现有代码。具体来说,有些子类与父类共享相同的模块,我打算将它们移动到单独的模块中。发生这种情况时,需要修复静态方法中对类外常量的引用。我可以通过以下方式之一来实现 1.从父模块导入所有常量 2. 将所有常量移至父类内部,将所有子静态方法更改为类方法 3. 添加“父类”。在每次引用常量之前

我个人想做#2,因为它避免了命名空间污染,这也是我问这个问题的原因。主要是风格问题。希望这提供了足够的上下文。

【问题讨论】:

  • 你读过THIS吗?
  • 我没有复制副本,因为我知道您想询问 WHEN,但是因为您没有提到 WHAT 你有阅读,所以我发布评论只是为了提供帮助。
  • 不用担心。我知道你是想帮忙,虽然帽子确实有点刺激我的肾上腺素。
  • 哈哈,如果您阅读我的其他帖子或 cmets,请保持冷静,您知道我从来没有冒犯过。在不提及您所阅读的内容的情况下,我认为我们大多数人都会发表类似的评论来证明您的“基于我所阅读的内容......”。 @erewok 的评论很重要,你的代码是与 webapps 相关的还是只是一般的?我认为这确实有所作为。
  • 我正在开发一个桌面应用程序。我的团队的惯例是,如果我们需要类指针,我们使用类方法,如果不需要,我们使用静态方法。我只是想验证该标准中是否缺少任何内容。

标签: python static-methods class-method


【解决方案1】:

实际上,几乎总是如此。您很少需要访问自动传递给类方法的类对象。 Python 类方法(不应与 Java 等语言中的类方法进行比较)主要用于提供替代构造函数。

具体来说,类方法看起来像

@classmethod
def my_class_method(cls, foo):
   ...

如果你从来没有在方法体中真正使用过cls,你可以先把它改成

@staticmethod
def my_static_method(foo):
   ...

接下来,您可能会考虑 my_static_method 是否真的需要成为该类的一部分,以及它是否可以是一个独立的函数。

如果你确实使用cls,那么显然它需要是一个类方法。

【讨论】:

  • 我想我可能不同意这一点,但我想到的例子都起源于 Django,我发现自己一直在模型上声明 classmethods 以便访问类变量以及何时不应将功能绑定到实例。另一方面,我发现staticmethods 是一种奇怪的说法,“这是我将任意与其他东西混为一谈的函数。”当然,这都是来自可能不完全有资格发表评论的人的意见。
  • 我应该把“很少需要”改成“除非你需要”。
  • 嗯,这与我的预期相反。我很高兴我问了。
  • 编辑后,我想我更同意这个答案。我个人认为staticmethods 没有太多好处,所以我会更加强调“考虑是否......实际上需要成为课堂的一部分。”我在很多情况下都打赌,答案是“不”。
猜你喜欢
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 2011-02-01
  • 2011-03-16
  • 2020-02-27
相关资源
最近更新 更多