OOP は、システムの動作をモデル化するものと考えることができます。システムは「現実世界」に存在する必要はないことに注意してください。ただし、現実世界のメタファーが役立つ場合があります(「パイプライン」、「工場」など)。
目的のシステムが複雑すぎて一度にモデル化できない場合は、それを小さなピースに分割して、それらをモデル化することができます(「問題ドメイン」)。 (多かれ少なかれ)数値、文字列、リストなどの組み込み言語オブジェクトのものです。
これらの単純なピースを作成したら、それらを組み合わせて大きなピースの動作を記述し、さらに大きなピースに組み合わせて、全体に必要なドメインのすべてのコンポーネントを記述することができます。システム。
いくつかのクラスを作成するのは、この「結合」フェーズです。希望どおりに動作する既存のオブジェクトが存在しない場合、クラスを作成します。たとえば、ドメインには「foos」、「bars」と呼ばれるfoosのコレクション、「bazs」と呼ばれるバーのコレクションが含まれる場合があります。fooは文字列でモデル化するのに十分単純であることに気付くかもしれませんので、そうします。バーは、Pythonが提供するものとは一致しない特定の制約に従うためにバーのコンテンツを必要とすることがわかります。その場合、この制約を強制する新しいクラスを記述することができます。おそらく、bazにはそのような特性がないため、リストで表すことができます。
これらのコンポーネント(foo、bar、baz)のすべてに対して新しいクラスを作成できることに注意してください。ただし、既に正しい動作をしているものがある場合は必要ありません。特に、クラスを有効にするには、何か(データ、メソッド、定数、サブクラスなど)を「提供」する必要があります。そのため、カスタムクラスのレイヤーが多数ある場合でも、何らかの組み込み機能を使用する必要があります。たとえば、foosの新しいクラスを作成した場合、おそらく文字列が含まれているだけなので、fooクラスを忘れて、代わりにこれらの文字列をbarクラスに含めるのはなぜですか?クラスも組み込みオブジェクトであり、特に柔軟なものであることに注意してください。
ドメインモデルを取得したら、それらの部分の特定のインスタンスを取得し、モデル化する特定のシステムの「シミュレーション」に配置できます(「...のための機械学習システム」など)。
このシミュレーションができたら、それを実行します。実際に...(またはモデリングしているものは何でも)の機械学習システム(のシミュレーション)があります。
今、あなたの特定の状況では、「機能抽出」コンポーネントの動作をモデル化しようとしています。問題は、「機能抽出機能」のように動作する組み込みオブジェクトがありますか、それともより単純なものに分割する必要がありますか?機能抽出プログラムは関数オブジェクトと非常によく似ているように見えるので、モデルとしてそれらを使用しても問題ないと思います。
これらの種類の概念について学習する際に留意すべきことの1つは、さまざまな言語がさまざまな組み込みの機能とオブジェクトを提供できることです(そしてもちろん、「オブジェクト」などの用語を使用しないものもあります!)。したがって、ある言語で意味のあるソリューションは、別の言語ではあまり役に立たない可能性があります(これは同じ言語の異なるバージョンにも当てはまります!)。
歴史的に、OOPの文献(特に「デザインパターン」)の多くは、Pythonとはまったく異なるJavaに焦点を当ててきました。たとえば、Javaクラスはオブジェクトではありません。Javaにはごく最近まで関数オブジェクトがありませんでした。Javaには厳密な型チェックがあり(インターフェイスとサブクラス化を促進します) floats / etc。オブジェクトではなく、Javaのメタプログラミング/イントロスペクションには「リフレクション」などが必要です。
私はJavaを選択しようとはしていません(別の例として、OOP理論の多くはSmalltalkを中心に展開していますが、これもPythonとはまったく異なります)、コンテキストについて非常に慎重に考えなければならないことを指摘しようとしていますソリューションが開発された制約、およびそれが現在の状況と一致するかどうか。
あなたの場合、関数オブジェクトは良い選択のようです。なぜ「ベストプラクティス」のガイドラインで関数オブジェクトが可能な解決策として言及されていないのか疑問に思っているなら、それは単にそれらのガイドラインがJavaの古いバージョンのために書かれたからかもしれません!