我如何在Python中设计一个类?

对于我以前的问题,在爪子内部检测爪子和脚趾方面,我有一些非常棒的帮助,但所有这些解决方案一次只能用于一次测量。

现在我拥有包含关闭的数据:

  • 约30只狗;
  • 每个测量有24个测量值(分成几个子组);
  • 每个测量至少有4个触点(每个爪子一个)和
  • 每个联系人分为5个部分和
  • 有几个参数,如接触时间,位置,总力等。
  • 替代文字

    显然,将所有东西都粘在一个大对象上并不会削减它,所以我想我需要使用类而不是当前的函数。 但是,即使我已经阅读了学习Python关于类的章节,但我没有将它应用到我自己的代码中(GitHub链接)

    每次我想要获得一些信息时,我也觉得处理所有数据是相当奇怪的。 一旦我知道每个爪子的位置,我就没有理由再计算一次。 此外,我想比较同一只狗的所有爪子,以确定哪个接触属于哪个爪子(前/后,左/右)。 如果我只继续使用函数,这将变得很糟糕。

    所以现在我正在寻找关于如何创建允许我以合理的方式处理我的数据(链接到一只狗的压缩数据)的类的建议。


    如何设计一堂课。

  • 写下单词。 你开始这样做。 有些人不知道他们为什么会遇到问题。

  • 将你的单词扩展为关于这些对象将要做什么的简单陈述。 也就是说,写下你将在这些事情上做的各种计算。 您的每条联系人有30条狗,24条测量指标,4条联系方式和几个“参数”的简短列表很有趣,但只是部分内容。 你的“每个爪子的位置”和“比较同一只狗的所有爪子以确定哪个接触属于哪个爪子”是对象设计中的下一步。

  • 强调名词。 认真。 有些人辩论这个价值,但我发现它对首次OO开发者有帮助。 强调名词。

  • 复习名词。 像“参数”和“测量”这样的通用名词需要替换为适用于问题领域中问题的具体名词。 具体有助于澄清问题。 泛型只是简化细节。

  • 对于每个名词(“接触”,“爪子”,“狗”等),记下该名词的属性以及该对象所参与的动作。 不要把这个缩短。 每个属性。 “数据集包含30条狗”例如是重要的。

  • 对于每个属性,确定这是否与定义的名词或某种其他类型的“原始”或“原子”数据(如字符串或浮点数或某种不可约的关系)有关系。

  • 对于每个动作或操作,你必须确定哪个名词有责任,哪些名词仅仅参与。 这是一个“可变性”的问题。 有些对象会更新,有些则不会。 可变对象必须对其突变负全部责任。

  • 此时,您可以开始将名词转换为类定义。 一些集体名词是列表,字典,元组,集合或命名的元素,你不需要做太多的工作。 其他类更复杂,要么是因为复杂的派生数据,要么是因为执行了一些更新/突变。

  • 不要忘记使用unittest单独测试每个类。

    此外,没有法律规定类必须是可变的。 例如,就你而言,你几乎没有可变数据。 你拥有的是由源数据集中的转换函数创建的派生数据。


    以下建议(类似于@ S.Lott的建议)来自Python,Beginning Python:从新手到专业

  • 写下你的问题的描述(问题应该怎么办?)。 强调所有名词,动词和形容词。

  • 通过名词,寻找潜在的课程。

  • 浏览动词,寻找潜在的方法。

  • 通过形容词,寻找潜在的属性

  • 将方法和属性分配给您的类

  • 为了完善课堂,本书还建议我们可以做到以下几点:

  • 写下(或者梦想)一系列用例---如何使用你的程序。 尽量涵盖所有的功能。

  • 一步一步地思考每一个用例,确保我们需要的所有东西都被覆盖。


  • 我喜欢TDD方法...因此,首先编写你想要的行为测试。 并编写通过的代码。 在这一点上,不要过多担心设计,只需获得一个测试套件和软件。 不要担心,如果你最终得到一个单一的丑陋的类,并且方法复杂。

    有时候,在这个最初的过程中,你会发现一个难以测试并需要分解的行为,仅仅为了可测试性。 这可能暗示单独的课程是有保证的。

    然后有趣的部分......重构。 在您运行软件后,您可以看到复杂的部分。 通常情况下,一小部分行为会变得明显,表明一个新的类,但如果没有,只是寻找方法来简化代码。 提取服务对象和值对象。 简化你的方法。

    如果你正确地使用git(你正在使用git,是不是?),你可以在重构过程中很快地尝试一些特定的分解,然后放弃它并在没有简化的情况下恢复。

    通过首先编写经过测试的工作代码,您应该深入了解使用先设计优先方法无法轻松获得的问题领域。 编写测试和代码推动你过去那个“我从哪里开始”瘫痪。

    链接地址: http://www.djcxy.com/p/84553.html

    上一篇: How do I design a class in Python?

    下一篇: When to use reinterpret