【发布时间】:2012-05-10 09:57:36
【问题描述】:
我曾经读到(我认为是在 Microsoft 的一个页面上),当您不需要一个类的两个或更多实例时,这是使用静态类的好方法。
我正在用 Python 编写一个程序。如果我对类的每个方法都使用@classmethod,这是不是一种糟糕的风格?
【问题讨论】:
标签: python class static instance class-method
我曾经读到(我认为是在 Microsoft 的一个页面上),当您不需要一个类的两个或更多实例时,这是使用静态类的好方法。
我正在用 Python 编写一个程序。如果我对类的每个方法都使用@classmethod,这是不是一种糟糕的风格?
【问题讨论】:
标签: python class static instance class-method
一般来说,像这样的用法最好只使用模块中的函数,而根本不使用类。
【讨论】:
namedtuple 或传递一些东西。无论如何,将东西存储在一个类中只是为了避免传递它们通常是一个坏主意——它可能会导致问题。
这是一种糟糕的风格,除非你真的需要访问这个类。
静态方法 [...] 不会转换为 Python 类方法。哦,当然,它会产生或多或少相同的效果,但类方法的目标实际上是做一些通常甚至不可能的事情[...](比如继承非默认构造函数)。 [...] 静态方法的惯用翻译通常是模块级函数,而不是类方法或静态方法。
【讨论】:
您可能会为此采取一些方法。正如其他人所提到的,您可以只使用模块级函数。在这种情况下,模块本身就是将它们结合在一起的命名空间。如果您需要跟踪状态,另一个选项可能很有用,即定义一个具有普通方法的类(采用 self),然后定义它的单个全局实例,并将其实例方法复制到模块命名空间。这是标准库“随机”模块所采用的方法——看看你的 python 目录中的lib/python2.5/random.py。在底部,它有这样的东西:
# 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)。
【讨论】:
根据我的经验,创建类是一个非常好的解决方案,原因有很多。一个是您最终使用该类作为“普通”类(尤其是制作不止一个实例)比您想象的更频繁。永远坚持类也是一个合理的风格选择;这可以使其他阅读/维护您的代码的人更容易,尤其是如果他们非常 OO - 他们会对课程感到满意。正如其他回复中所指出的,仅使用“裸”功能来实现也是合理的。您可能希望从一个类开始并使其成为单例/博格模式(如果您在谷歌上搜索这些示例,则会有很多示例);它使您可以灵活地(重新)使用该类来满足其他需求。我建议不要使用“静态类”方法,因为它是非常规且非 Python 的,这使得它更难阅读和维护。
【讨论】:
您实际上可能想要一个单例类而不是静态类: Making a singleton class in python
【讨论】: