【问题标题】:How to group or cluster many methods of a Python object如何对 Python 对象的许多方法进行分组或聚类
【发布时间】:2019-09-01 19:25:43
【问题描述】:

我有一个有很多方法的对象。这些方法可以分组或聚类。组是例如'model1', 'model2',..., 有calc_density,calc_temperature, get_temperature,...等方法 另一组“修改”将收集所有方法来修改对象(一个字典)的数据。

现在我将所有方法都放在一个文件中,将来会增加(大约 50-200 个方法)。我“解决”了将组名添加到方法名的问题,我认为这不太好。

my_object.model1CalcDensity
my_object.model2CalcTemperature
my_object.modifyApplyLimits

理想情况下,我希望有这样的结构

my_object.model1.CalcDensity
my_object.model2.CalcTemperature
my_object.modify.ApplyLimits

组的方法应该在每个组的单独文件中。我知道,我将如何使用模块中的简单函数来做到这一点,但我不确定这如何与对象的方法一起使用。 (但不得不承认我的Python知识非常有限)有没有“标准”的解决方案?

【问题讨论】:

  • 你不能为每个“组”功能定义一个单独的类,并给出作为这些类对象的“主类”属性。这将允许您以您所说的“理想情况下”的方式访问这些方法。
  • 我认为我对 OOP 不够熟悉,无法完全理解您的建议,因为我来自 FORTRAN 的 CFD 建模。该对象现在保存像成分这样的数据,并且方法将属性(密度,温度,..)添加到每个组的此数据集或修改成分。这符合你的想法吗?我在哪里可以找到适合您的场景的示例?
  • 您能否详细说明“修改”组?不清楚您所说的“收集所有方法来修改对象的数据(一个字典)”是什么意思。
  • @baudri 作为 OO 设计的捷径,将作用于相同数据的方法与数据组合在一起。我忘了是谁说的,但可以将对象视为数据和对其进行操作的方法的私有范围。
  • ...顺便说一句,欢迎来到 SO!

标签: python oop object methods architecture


【解决方案1】:

看起来你知道如何用模块和函数来划分你的代码。如果您将my_object 转换为一个包,您可以通过将您的函数分组到包中的不同模块中,然后从包的外部导入包,从而完全实现所需的语法。模块或包仍然是一个对象,因此可能就足够了,并且是您最简单的路径。

如果您采用 OOP 风格,则在 OOP 设计中您不会将单个对象(或类)划分为多个文件。实际上,您将任何类限制为只有 5 到 7 个方法,因此您永远不必真正划分一个大类,并且您会考虑如何根据它们彼此之间的关系、它们的目标等将类分组到模块或包中。在同一个模块中有几个不同的类在 Python 中也很常见。您考虑如何在系统(或子系统)内划分功能组,然后选择合适的类。

如果你要划分一个类,那是因为你已经犯了写一个“巨型类”的错误。就像通过将经典的模块化程序包装在一个大的 App 对象中来转换它一样。有时课程变得比他们应该的更大。相应的对象也被称为“上帝对象”,因为更大意味着更多的知识被保存在里面。它们应该被重写。

这可能或多或少地出现在 Rob Zigmond 的评论中,如果您仍然想要一个包含所有功能的对象,尽管不推荐使用 5 到 7 的限制。另请注意,此限制基于我们的记忆能力。您会记住每个对象的这样一小组方法,但不会记住 50-200 个方法列表。

对于经典的模块/包方式,请参阅here 作为我回答的示例。导入不使用点,因为它们是相对的,这是常见的做法,但您可以只导入顶部模块,然后通过里面的属性点。

【讨论】:

    猜你喜欢
    • 2018-03-19
    • 2017-02-14
    • 1970-01-01
    • 2020-04-20
    • 2013-02-10
    • 2018-04-28
    • 2023-03-04
    • 2022-01-18
    相关资源
    最近更新 更多