Python:何时使用静态方法而不是类方法?

8
根据我所读的,类方法与静态方法基本相同,但有一些例外,其优点在于提供类指针。
因此,如果在类内定义了非实例方法,那么是否真的有什么理由使用静态方法而不是类方法呢?
编辑:由于你们中的一些人很快就把这个问题当作另一个问题的重复。这不是关于类和静态方法之间差异的问题。相反,这是一个关于如何在它们的功能重叠的绝大多数情况下决定两者之间的区别的问题。
编辑#2:我之所以问这个问题,是因为我正在重构其他人编写的一些现有代码。具体来说,有些子类与父类共享相同的模块,我打算将它们移动到单独的模块中。当发生这种情况时,需要修复静态方法中对类外常量的引用。我可以通过以下方式之一完成这项工作: 1. 从父模块导入所有常量 2. 将所有常量移动到父类中,并将所有子静态方法更改为类方法 3. 在每个对常量的引用前添加“ParentClass。”
我个人希望采取第二种方法,因为它避免了命名空间污染,这也是我提出这个问题的原因。这主要是一个风格问题。希望这提供了足够的背景信息。

1
你有没有阅读过这篇文章 - Anzel
我没有将重复内容转换,因为我知道你想问的是“何时”,但由于你没有提到你读了什么,所以我只是试图帮助并发表了评论。 - Anzel
没关系。我明白你想要帮忙,但是大写字母确实让我有点兴奋。 - user1836155
哈哈,如果你读过我的其他帖子或评论,你就知道我从来没有冒犯过任何人。而且不提及你所读的内容,我认为大多数人都会发表类似的评论来证明你的“根据我所读到的...”是正确的。@erewok的评论中提出了一个很好的观点,你的代码是针对Web应用程序相关的还是通用的?我认为这确实有所区别。 - Anzel
我正在开发一个桌面应用程序。我们团队的惯例是,如果需要类指针就使用类方法,如果不需要就使用静态方法。我只是在尝试验证是否有任何标准缺失。 - user1836155
显示剩余2条评论
1个回答

7
几乎总是需要,实际上。你很少需要访问自动传递给类方法的类对象。Python类方法(不应与像Java这样的语言中的类方法进行比较)主要用于提供替代构造函数。
具体地说,类方法将类似于
@classmethod
def my_class_method(cls, foo):
   ...

如果在方法体中从未实际使用cls,你可以先将其更改为
@staticmethod
def my_static_method(foo):
   ...

接下来,您可以考虑my_static_method是否需要成为类的一部分,或者它是否可以是一个单独的函数。

如果您使用了cls,显然它需要成为一个类方法。


我认为我可能不同意这个观点,但是我想到的所有例子都源自Django,在那里我经常在模型上声明classmethod以便访问类变量,并且当功能不应绑定到实例时。另一方面,我发现staticmethod是一种奇怪的方式,可以说,“这是一个函数,我将任意地将其与其他内容混合在一起。”当然,这都是个人观点,来自一个可能没有完全资格发表评论的人。 - erewok
我应该把“很少需要”改成“除非你需要”。 - chepner
嗯,这与我的预期相反。我很高兴问了出来。 - user1836155
编辑后,我认为我更同意这个答案。我个人并不认为staticmethod有太多好处,所以我会更加强调“考虑是否...实际上需要成为类的一部分”。我打赌在很多情况下,答案是“不需要”。 - erewok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接