我曾经在微软的一个页面上看到过这样的说法:当您不需要两个或更多实例时,使用静态类是一种好方法。
我正在编写一个Python程序。如果我对类的每个方法都使用@classmethod
,这是否是不好的风格?
我曾经在微软的一个页面上看到过这样的说法:当您不需要两个或更多实例时,使用静态类是一种好方法。
我正在编写一个Python程序。如果我对类的每个方法都使用@classmethod
,这是否是不好的风格?
一般来说,这样的用法最好直接在一个模块中使用函数,而不需要用类。
这是可怕的风格,除非你确实需要访问这个类。
静态方法[...]不等同于Python中的classmethod。当然,它产生了更多或更少相同的效果,但classmethod的目标实际上是做一些通常甚至不可能的事情(比如继承非默认构造函数)。通常,一个静态方法的惯用翻译是模块级别的函数,而不是classmethod或staticmethod。
根据我的经验,创建一个类是解决许多问题的好方法。其中之一是你会经常像使用“普通”类一样使用该类(特别是创建不止一个实例)。另一个原因是坚持使用类作为合理的风格选择;这可以使阅读/维护您的代码的其他人更容易,尤其是如果他们非常熟悉面向对象编程-他们将对类感到舒适。正如其他答复中所指出的那样,仅使用“裸”函数来实现也是合理的。您可以从创建一个类开始,并将其转化为单例/ Borg模式(如果您在谷歌上搜索,��以找到很多示例);这使您可以灵活地(重新)使用该类以满足其他需求。我建议不要采用“静态类”方法,因为这种非常规和非Pythonic的做法会使代码难以阅读和维护。
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
)。
namedtuple
或类似的内容来传递。仅为避免传递它们而将东西存储在类中通常不是一个好主意 - 这可能会导致问题。 - Gareth Latty