如何用Python设计类?

2024-06-10 01:01:48 发布

您现在位置:Python中文网/ 问答频道 /正文

在我之前的问题上,我得到了一些非常棒的帮助,但所有这些解决方案一次只能用于一个度量。

Now I have data包含:

  • 大约30只狗
  • 每个有24个测量值(分为几个亚组)
  • 每次测量至少有4个触点(每个爪一个)和
    • 每个触点分为5部分
    • 有几个参数,如接触时间、位置、总力等

alt text

很明显,把所有东西都放在一个大对象中并不能减少它,所以我认为我需要使用类,而不是当前大量的函数。但是,即使我读过学习Python关于类的章节,我还是无法将它应用到我自己的代码中(GitHub link

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

因此,现在我正在寻找如何创建类的建议,这些类将允许我以合理的方式处理数据(link to the zipped data of one dog)。


Tags: 数据对象函数data参数度量have时间
3条回答

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

有时,在这个初始过程中,您会发现一个行为很难测试,需要分解,只是为了可测试性。这可能暗示需要一个单独的类。

有趣的是。。。重构。在你有了工作软件后,你可以看到复杂的部分。通常情况下,小部分行为会变得很明显,这意味着需要一个新类,但如果不是,那么只需寻找简化代码的方法。提取服务对象和值对象。简化你的方法。

如果您正确地使用了git(您正在使用git,不是吗?),您可以在重构过程中很快尝试某些特定的分解,然后放弃它,如果它不能简化事情,则返回。

通过首先编写经过测试的工作代码,您应该能够深入了解使用“设计优先”方法无法轻松获得的问题领域。编写测试和代码会让您摆脱“从哪里开始”的瘫痪状态。

以下建议(类似于@S.Lott的建议)来自本书,Beginning Python: From Novice to Professional

  1. Write down a description of your problem (what should the problem do?). Underline all the nouns, verbs, and adjectives.

  2. Go through the nouns, looking for potential classes.

  3. Go through the verbs, looking for potential methods.

  4. Go through the adjectives, looking for potential attributes

  5. Allocate methods and attributes to your classes

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

  1. Write down (or dream up) a set of use cases—scenarios of how your program may be used. Try to cover all the functionally.

  2. Think through every use case step by step, making sure that everything we need is covered.

如何设计一个类。

  1. 把单词写下来。你开始这么做了。有些人不知道为什么他们有问题。

  2. 将您的一组单词扩展成关于这些对象将要执行的操作的简单语句。也就是说,写下你要做的各种计算。你列出的30只狗,24个测量值,4个接触点,以及每个接触点的几个“参数”很有趣,但这只是故事的一部分。你的“每个爪子的位置”和“比较同一条狗的所有爪子,以确定哪个接触属于哪个爪子”是对象设计的下一步。

  3. 在名词下面划线。说真的。有些人争论这个的价值,但我发现对于第一次使用OO的开发人员来说,它是有帮助的。在名词下面划线。

  4. 复习名词。像“parameter”和“measurement”这样的通用名词需要替换为特定的、具体的名词,这些名词适用于问题领域中的问题。细节有助于澄清问题。泛型只是省略细节。

  5. 对于每个名词(“contact”、“paw”、“dog”等),记下该名词的属性以及该对象所参与的动作。别抄近路。所有属性。”数据集包含30只狗“例如很重要。

  6. 对于每个属性,确定这是与已定义的名词的关系,还是与其他类型的“原始”或“原子”数据(如字符串、浮点或不可约的内容)的关系。

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

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

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

而且,没有法律规定类必须是可变的。例如,在您的例子中,几乎没有可变数据。您所拥有的是派生数据,由来自源数据集的转换函数创建。

相关问题 更多 >