【问题标题】:a class with all static methods [closed]具有所有静态方法的类[关闭]
【发布时间】:2017-03-13 15:47:10
【问题描述】:

我有一个所有方法都是静态的 python 类,

class SomeClass:

    @staticmethod
    def somemethod(...):
       pass

    @staticmethod
    def somemethod2(...):
       pass

    @staticmethod
    def somemethod3(...):
       pass

这样做是否正确?

【问题讨论】:

  • 当然你可以将它重构为函数。但这并不重要。
  • 这应该尖叫“我应该只是一个模块”
  • 静态方法在 Python 中不是很常见,而且只有静态方法的 Python 类对我来说似乎很奇怪——Python 不是 Java,在 Python 中盲目地复制 Java 模式往往会产生丑陋,臃肿的代码。为什么不把它们变成在模块级别定义的普通函数呢?您可以将它们放入自己的模块中以将它们组合在一起。
  • @PM2Ring 它可能会增加模块的数量,每个模块只有两个或三个功能
  • @GrizzledSquirrel 你有两种可能的结果。要么你接受这应该是一个真正的模块——或者至少,不是一个类,或者我们会把它关闭为“主要基于意见”——“许多好的问题会根据专家的经验产生一定程度的意见,但答案是这个问题往往几乎完全基于意见,而不是事实、参考资料或特定专业知识。”

标签: python python-3.x


【解决方案1】:

如果所有方法都是静态的,则不需要类。

(如果你有一个只有 init 和 1 个方法的类,也一样)

someclass.py

class SomeClass:

    @staticmethod
    def somemethod(...):
        pass

    @staticmethod
    def somemethod2(...):
        pass

    @staticmethod
    def somemethod3(...):
        pass

然后你主要像这样使用它:

from someclass import SomeClass
some_class = SomeClass()
some_class.somemethod()
....

我总是将这样的类重构为简单的方法

someclass.py

def somemethod(...):
    pass

def somemethod2(...):
    pass

def somemethod3(...):
    pass

那我这样用:

import someclass
someclass.somemethod()
...

这不是更干净更简单吗?

额外信息

class SomeClass:

    foo = 1

    def __init__(self, bar):
        self.bar = bar
        self.foo = 2

    @staticmethod
    def somemethod():
        # no access to self nor cls but can read foo via SomeClass.foo (1)
        foo = SomeClass.foo
        SomeClass.someclassmethod()
        ...

    @classmethod
    def someclassmethod(cls, ...):
        # access to cls, cls.foo (always 1), no access to bar
        foo = cls.foo
        ...

    def someinstancemethod(self, ...):
        # access to self, self.bar, self.foo (2 instead of 1 because of init)
        foo = self.foo
        bar = self.bar
        self.somemethod()
        self.someclassmethod()
        ...

【讨论】:

  • 这是正确的,唯一的问题是因为 OP 的类只有静态方法,你永远不会实例化它;他们只会使用SomeClass.somemethod()。
  • 同意,但大多数时候我通过实例看到使用静态方法的代码。我猜大多数人认为 SomeClass.somemethod() 是用于类方法的......但静态方法不需要 self 也不需要 cls。
  • 虽然@PM2Ring 实际上有相同的答案,但我将此答案标记为举个例子
  • 可以说你永远不需要上课。你总是可以只使用一堆模块和闭包!您将使用具有所有静态方法的类来隔离范围和命名空间,而无需创建新模块。这在您希望将所有内容隔离到单个文件并且您有几个非常相似的结构的情况下特别有用,例如,在基本 CLI 应用程序中具有 CRUD 操作的 3 个不同实体。 @DevLounge
【解决方案2】:

所描述的情况过于笼统,无法给出确切的配方。仅依靠您的示例常规函数在这里看起来更好,而不是装饰器和类的复杂性。

def somemethod():
   pass

def somemethod2():
   pass

def somemethod3():
   pass

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2013-05-24
    • 2011-01-29
    • 1970-01-01
    相关资源
    最近更新 更多