1. ホーム
  2. python

[解決済み] Pythonでクラスを設計するには?

2022-05-07 16:30:51

質問

以前の質問で、本当に素晴らしい助けをいただきました 前脚検出用 肉球の中の足指 しかし、これらの解決策はすべて、一度に1つの測定に対してのみ機能します。

今、私はデータ で構成されています。

  • 約30匹の犬
  • はそれぞれ24の測定値(いくつかのサブグループに分かれている)を持っています。
  • 各測定値には少なくとも4つの接点があり(各足に1つずつ)、かつ
    • 各接点は5つの部分に分割され
    • は、接触時間、位置、合計力など、いくつかのパラメータを持っています。

もちろん、すべてを1つの大きなオブジェクトにまとめることはできないので、現在のようにたくさんの関数を使うのではなく、クラスを使う必要があると考えたのです。しかし、Learning Pythonのクラスについての章を読んでも、自分のコードにそれを適用することができません ( GitHubリンク )

また、すべてのデータを処理するのはむしろおかしい気がします というのは、何か情報を得たいときです。前足の位置が分かれば、改めて計算する必要はないんです。さらに、同じ犬のすべての前足を比較して、どの接触がどの前足に属しているか(前/後、左/右)を判断したい。このまま関数だけを使っていると、ごちゃごちゃになってしまう。

そこで今、私のデータを処理するためのクラスをどのように作成したらよいか、アドバイスを求めているところです( 一匹の犬のzipデータへのリンク ) を感覚的に使うことができます。

解決方法は?

クラス設計の方法

  1. 言葉を書き留める。 これをやり始めたんですね。 そうでない人もいて、なぜ問題があるのか不思議に思います。

  2. これらのオブジェクトが何をするのかについて、一連の単語を簡単なステートメントに展開します。 つまり、これらのものに対して行うさまざまな計算を書き出すのです。 30匹の犬、24の測定値、4つのコンタクト、そしてコンタクトごとにいくつかのパラメータという短いリストは興味深いものですが、物語の一部でしかありません。 各足の位置と、同じ犬のすべての足を比較して、どの接触がどの足に属するかを決定することは、オブジェクト設計の次のステップです。

  3. 名詞に下線を引く。 マジで。 この価値について議論する人もいますが、私は初めてOOを使う開発者には役立つと思います。 名詞に下線を引くのです。

  4. 名詞を見直す。 パラメータや測定値などの一般名詞は、問題領域で問題に適用される具体的な名詞に置き換える必要があります。 固有名詞は、問題を明確にするのに役立ちます。 一般名詞は、単に詳細を省くだけです。

  5. 各名詞("contact", "paw", "dog" など)について、その名詞の属性とその対象が行う行為を書き出す。 短絡的に考えてはいけません。 例えば、"Data Set contains 30 Dogs"のように、すべての属性が重要です。

  6. 各属性について、これが定義された名詞との関係なのか、それとも文字列や浮動小数点数などの他の種類の「プリミティブ」または「アトミック」なデータなのかを特定する。

  7. 行動や操作ごとに、どの名詞が責任を持ち、どの名詞が単に参加しているかを特定する必要があるのです。 これは、「変異性」の問題です。 あるオブジェクトは更新され、他のオブジェクトは更新されない。 ミュータブルなオブジェクトは、そのミュータブルに対して全責任を負わなければならない。

  8. この時点で、名詞をクラス定義に変換し始めることができます。 集合名詞の中には、リスト、辞書、タプル、セット、名前付きタプルなどがあり、あまり多くの作業を行う必要はありません。 他のクラスは、複雑な派生データや、更新/変異が実行されるため、より複雑になります。

unittestを使用して各クラスを分離してテストすることを忘れないでください。

また、クラスは必ずミュータブルでなければならないという法則はありません。 例えば、あなたの場合、ミュータブルなデータはほとんどありません。 あるのは、ソースデータセットから変換関数で作られた派生データです。