29

我曾经读过(我认为在 Microsoft 的页面上),当您不需要一个类的两个或多个实例时,这是使用静态类的好方法。

我正在用 Python 编写一个程序。如果我@classmethod对类的每个方法都使用它,这是一种不好的风格吗?

4

5 回答 5

36

一般来说,像这样的用法最好只使用模块中的函数,而不需要类。

于 2012-04-30T17:48:36.833 回答
15

这是一种糟糕的风格,除非你真的需要访问这个类。

静态方法 [...] 不会转换为 Python 类方法。哦,当然,它或多或少会产生相同的效果,但类方法的目标实际上是做一些通常甚至不可能的事情[...](比如继承非默认构造函数)。[...] 静态方法的惯用翻译通常是模块级函数,而不是类方法或静态方法。

来源

于 2012-04-30T17:49:28.087 回答
12

根据我的经验,创建一个类是一个非常好的解决方案,原因有很多。一个是您最终使用该类作为“普通”类(尤其是制作不止一个实例)比您想象的更频繁。永远坚持类也是一个合理的风格选择;这可以使其他阅读/维护您的代码的人更容易,尤其是如果他们非常 OO - 他们会对课程感到满意。正如其他回复中所指出的,仅使用“裸”功能来实现也是合理的。您可能希望从一个类开始并使其成为单例/博格模式(如果您在谷歌上搜索这些示例,则会有很多示例);它使您可以灵活地(重新)使用该类来满足其他需求。我建议反对“静态类”方法,因为它是非常规和非 Pythonic,

于 2012-04-30T18:00:03.003 回答
6

您可能会为此采取一些方法。正如其他人所提到的,您可以只使用模块级函数。在这种情况下,模块本身就是将它们结合在一起的命名空间。如果您需要跟踪状态,另一个选项可能很有用,即定义一个具有普通方法的类(采用 self),然后定义它的单个全局实例,并将其实例方法复制到模块命名空间。这是标准库“随机”模块采用的方法——lib/python2.5/random.py在你的 python 目录中查看。在底部,它有这样的东西:

# Create one instance, seeded from current time, and export its methods
# as module-level functions.  [...]
_inst = Random()
seed = _inst.seed
random = _inst.random
uniform = _inst.uniform
...

或者您可以采用您描述的基本方法(尽管我建议使用@staticmethod而不是@classmethod在大多数情况下)。

于 2012-04-30T17:58:55.127 回答
0

你可能实际上想要一个单例类而不是一个静态类: Making a singleton class in python

于 2016-04-23T12:03:15.403 回答