Python中的静态类

ryn*_*ynd 25 python static class instance class-method

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

我正在用Python编写程序.如果我@classmethod用于课堂的每一种方法,这是一种糟糕的风格吗?

Gar*_*tty 33

通常,这样的使用最好只使用模块中的函数,而根本不使用类.

  • +1.如果你没有封装任何数据,绝对不需要在Python中创建一个类. (10认同)
  • 我有时只从函数开始,但后来意识到,因为我喜欢编写小函数,所以有时必须在 3 或 4 个函数之间传递相同的参数,此时我开始想要封装该参数。我还没有解决这个难题。想法? (2认同)

Ign*_*ams 14

这是一种糟糕的风格,除非你真的需要访问这门课程.

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

资源


Art*_*wri 8

根据我的经验,创建课程是一个非常好的解决方案,原因有很多.一个是你最后使用这个类作为一个"普通"类(特别是只做一个实例)比你想象的更频繁.坚持使用课程也是一种合理的风格选择; 这可以使阅读/维护代码的其他人更容易,尤其是如果他们非常OO - 他们会对课程感到满意.如其他回复中所述,仅使用"裸"功能进行实施也是合理的.您可能希望从一个类开始,并使其成为单例/ Borg模式(如果您对这些模式进行了大量示例); 它使您可以灵活地(重新)使用该类来满足其他需求.我建议不要使用'静态类'方法作为非传统和非Pythonic,这使得它更难以阅读和维护.

  • 你的大部分答案,主要的例外是第二句和最后一句,只是争论(而且我倾向于不同意)和旁边的观点.我会说减少所有关于如何改善它的优秀课程,你怎么看? (7认同)
  • 我既同意又不同意这个答案。所以我无法决定是按向上还是向下按钮。无论如何,我同意对象使代码更易于阅读和维护。我不同意使用 singleton/borg 模式 http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Singleton.html。这并不是说这是一个糟糕的模式;而是说它是一个糟糕的模式。然而,在极其复杂的代码项目中,使用带有类变量的静态方法更容易维护和阅读。是的,这在技术上可能不正确,但初级程序员会感谢你。 (3认同)

Edw*_*per 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
...
Run Code Online (Sandbox Code Playgroud)

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