【问题标题】:Class with only class methods只有类方法的类
【发布时间】:2019-02-12 21:13:14
【问题描述】:

我有一个只有类方法的类。它是一种 Pythonic 的命名空间方式吗?如果不是,那么对类似方法进行分组的最佳方式是什么?

class OnlyClassMethods(object):
    @classmethod
    def method_1(cls):
        pass

    @classmethod
    def method_2(cls):
        pass

【问题讨论】:

  • 到目前为止,这个问题过于宽泛,因为缺少上下文。例如,如果这些方法之间没有共享状态,那么使用顶级函数来“命名空间”可能更有意义
  • 这个问题不是很精确。为什么只使用 classmethods ?如果你想通过一个类来生成一个类,我鼓励你看看meta classesstackoverflow.com/questions/100003/…
  • @DeepSpace 如果您只使用类方法,那么您所关心的就是修改实例方法或类属性。我有一个类似的问题,我需要根据不同的参数生成不同的类,而这样做的(不好的)方法是首先生成一个实例,然后使用类方法来替换一些行为。无论如何,我推断这是 OP 的用例,虽然我不确定,这就是为什么我以“问题不是很精确”开始我的评论。

标签: python design-patterns


【解决方案1】:

一个类意味着有实例,而不是作为命名空间。如果您的类从未实例化,则它不提供intended purpose of Python's class

如果你想命名一组相关的方法,创建一个新的module,即另一个.py文件,然后导入它。

示例

这里我们创建一个名为helpers 的模块,其中包含一些相关的方法。然后可以将该模块导入到我们的main 文件中。

helpers.py

def method_1():
    ...

def method_2():
    ...

main.py

import helpers

helpers.method_1()
helpers.method_2()

【讨论】:

  • 真的回答了我的问题。谢谢
  • 如何将子类化和继承转化为模块方法?
  • @Hyperplane 如果你想要更多的方法,你可以简单地导入两个模块。否则,如果您想要一个修改了某些方法的模块,您可以在第二个模块中执行 from module import * 并用您自己的方法隐藏一些方法。
  • 我不太明白。类方法可以利用类属性和其他类方法。假设我有一个类:class A,它有一个类属性:def data_dir(cls): return BASEPATH.joinpath(cls.__name__)),它设置了一个类可能存储一些数据的目录,还有一些类方法def store_cls_data(cls),它在cls.data_dir 中转储与类相关的数据.然后让我们有一个子类class B(A),通过继承,它也可以使用这些方法。如果我将其转换为模块,您将如何处理访问类属性的类方法?
  • @Hyperplane 我想说,如果你真的需要继承,那么继续使用类,因为模块不会为你提供该功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 2015-10-03
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多