【问题标题】:Static classes in PythonPython中的静态类
【发布时间】:2012-05-10 09:57:36
【问题描述】:

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

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

【问题讨论】:

    标签: python class static instance class-method


    【解决方案1】:

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

    【讨论】:

    • +1。如果不封装任何数据,绝对不需要在 Python 中创建类。
    • 我有时只从函数开始,但后来意识到,因为我喜欢写小函数,有时我必须在其中的 3 或 4 个函数之间传递相同的参数,此时我开始想封装那个参数。我还没有解决这个难题。想法?
    • @Leonid 我认为如果你的函数是独立的但仍然需要它们之间的参数,只需传递这些参数。如果您发现有很多调用具有相同的参数集合,则可能会生成一个namedtuple 或传递一些东西。无论如何,将东西存储在一个类中只是为了避免传递它们通常是一个坏主意——它可能会导致问题。
    • @Lattyware,我不喜欢将状态用作哲学,但真正的函数式语言(如 F#、Clojure、Haskell)仍然占据着相当小的市场。 Python 是一种多范式语言,因此通常取决于程序员如何使用它。以下内容相当模糊:“将事物存储在类中只是为了避免传递它们通常是一个坏主意——它可能会导致问题。”。你会详细说明具体的危险、问题和缺点吗?否则我可能会假设你对函数和对象有偏见。
    • @Leonid 我绝对不提倡完全避免状态——尤其是在 Python 中。我的意思是,如果不应该在值的生命周期是函数调用的生命周期的情况下将值存储在类中——实际上只是为了避免通过子函数传递值。危险在于突然之间该状态可能会在外部发生突变(例如该函数在其他地方运行),这可能会导致错误和脆弱性。由于依赖于这种状态,它还降低了重用这些函数的能力。
    【解决方案2】:

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

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

    source

    【讨论】:

      【解决方案3】:

      您可能会为此采取一些方法。正如其他人所提到的,您可以只使用模块级函数。在这种情况下,模块本身就是将它们结合在一起的命名空间。如果您需要跟踪状态,另一个选项可能很有用,即定义一个具有普通方法的类(采用 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)。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 你的大部分答案,主要的例外是第二句话和最后一句话,都是有争议的(我倾向于不同意)并且题外话。我想说的是,消除关于课程有多棒的所有绒毛会改善它,你怎么看?
        • 我同时同意和不同意这个答案。所以我无法决定是向上还是向下按钮。无论如何,我同意 Objects 使代码更易于阅读和维护。我不同意使用单例/博格模式python-3-patterns-idioms-test.readthedocs.io/en/latest/…。并不是说它的模式不好;然而,在一个极其复杂的代码项目中,使用带有类变量的静态方法更容易维护和阅读。是的,这在技术上可能不正确,但初级程序员会感谢你。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2014-03-03
          • 2013-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多