从参数解析对象的内容时,实例化对象的正确方法

时间:2018-09-16 21:50:45

标签: python

我正在上一个使用图形的类。实例化此类图形对象的方法之一是使用文件路径作为构造函数参数,然后从那里读取/复制图形结构。为了进行实际的解析,我使用了辅助功能。 实际设置图形字段的正确方法是哪种? 缩短,假设魔术返回了图形结构:

class Graph:

    def __init__(self, parse):
        self.graph = self._parse_file(parse)

    def _parse_file(file_path):
        return magic(file_path)

class Graph:

    def __init__(self, parse):
        self._parse_file(parse)

    def _parse_file(file_path):
        self.graph = magic(file_path)

这有关系吗?在我看来,我好像丢失了一些东西。

2 个答案:

答案 0 :(得分:2)

出于以下原因,我会选择第一个选项:

  1. 因为您的_parse_file方法恰好可以做一件事,所以它清楚地将职责分开。在第二个选项中,它执行两件事:解析文件更新实例状态。
  2. 更容易测试。您可以将_parse_file转换为classmethodstaticmethod并分别进行测试,而无需创建Graph实例,当Graph.__init__得到更大,更复杂。
  3. 它可以保护您免受意外使用。尽管_parse_file带有下划线前缀,但它仍然不是 truly 私有的,因此有人可能会在_parse_file的现有实例上调用Graph,第二种情况将修改其状态,您可能要避免这种情况。

答案 1 :(得分:0)

您似乎步入正轨,但这有一些疑问:

  1. Graph.graph令人担忧。

  2. 测试:假设您打算在某个时候测试程序-您是否愿意构造图形,将其转储到文件中,然后从文件中读取并从此处检查图形?还是只保留少量静态图形文件作为灯具?

  3. 混合抽象级别的
  4. 程序在晚上会困扰您(您的用户或合作者),并且随着大小/复杂度的增加而变得非常昂贵。文件是文件,数据结构是数据结构,magic()是您的读者。

  5. 可读性好吗?没有一个选项特别适合阅读。想想pd.read_csv()-这是一个不错的filename -> new data structure转换。 pd.Dataframe也是一种数据结构,您可以从列表/字典中构造它,而无需锁定文件。是什么使Graph与众不同?

在下一轮设计审查中,您可以考虑:

  • 一个干净的数据类,用于保存图形内部。它可能就像dict / json
  • 一样简单
  • 文件读取/文件转储功能
  • 独立图转换功能
  • 只要能抗拒就不要上课
  • 一旦选择它,
  • 就用可行的原语组成该类。