如何在Python中设计类?

Ivo*_*pse 142 python oop class-design

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

现在我有数据包含:

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

替代文字

显然将所有内容都放在一个大对象上并不会削减它,所以我认为我需要使用类而不是当前的大量函数.但即使我已经阅读了学习Python关于类的章节,我也无法将其应用于我自己的代码(GitHub链接)

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

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

S.L*_*ott 432

如何设计课程.

  1. 写下这些话.你开始这样做了.有些人不知道为什么他们有问题.

  2. 将您的单词扩展为关于这些对象将要执行的操作的简单语句.也就是说,记下你将对这些事情做的各种计算.每个联系人的30条狗,24个测量值,4个联系人和几个"参数"的简短列表很有意思,但这只是故事的一部分.您的"每个爪子的位置"和"比较同一只狗的所有爪子以确定哪个接触属于哪个爪子"是对象设计的下一步.

  3. 强调名词.认真.有些人讨论这个的价值,但我发现对于第一次OO开发者来说它有所帮助.强调名词.

  4. 复习名词.像"参数"和"测量"这样的通用名词需要替换为适用于您的问题域中的问题的特定具体名词.细节有助于澄清问题.泛型只是简单的细节.

  5. 对于每个名词("联系人","爪子","狗"等),记下该名词的属性以及该对象所参与的动作.不要吝啬这一点.每个属性.例如,"数据集包含30只狗"很重要.

  6. 对于每个属性,确定这是与定义的名词的关系,还是某种其他类型的"原始"或"原子"数据,如字符串或浮点数或不可简化的东西.

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

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

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

此外,没有法律规定课程必须是可变的.例如,在您的情况下,您几乎没有可变数据.您拥有的是由源数据集中的转换函数创建的派生数据.


mit*_*llc 23

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

  1. 写下你的问题的描述(问题应该怎样做?).强调所有名词,动词和形容词.

  2. 浏览名词,寻找潜在的课程.

  3. 通过动词,寻找潜在的方法.

  4. 浏览形容词,寻找潜在的属性

  5. 为您的类分配方法和属性

为了完善课程,本书还建议我们可以做以下事情:

  1. 记下(或梦想)一组用例 - 如何使用您的程序的场景.尽量覆盖所有功能.

  2. 逐步思考每个用例,确保涵盖所需的一切.


Les*_*ill 13

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

有时,在这个初始过程中,您会发现一个难以测试且需要分解的行为,仅用于可测试性.这可能暗示需要单独的课程.

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

如果你正确使用git(你使用的是git,不是吗?),你可以在重构期间快速尝试一些特定的分解,然后放弃它并在不简化的情况下恢复.

通过首先编写经过测试的工作代码,您应该获得对使用设计优先方法无法轻易获得的问题域的深入了解.编写测试和代码会让你超越"我从哪里开始"瘫痪.