2016-10-11 13 views
1

私はPythonで単純なWebスクレイパーを開発していますが、コードをどのように構築するのかという質問がありました。他のプログラミング言語(特にC++やC#のようなコンパイルされた言語)では、私はすべての関数をクラスにラッピングする習慣を持っていました。私。 Webスクレイピングの例では、 "WebScraper"のようなクラスがあり、そのクラス内のすべての関数を保持しています。元の「WebScraper」クラスのインスタンスを複数インスタンス化する必要がある場合は、「WebScraperManager」のような2番目のヘルパークラスを作成することもできます。クラス内のすべての関数をラップするのは "Python-esque"ですか?

これは私の現在の質問につながります。今の例では似たような論理が成り立ちますか?あるいは、WebScraper.pyファイルをそのファイル内にラッパークラスなしで定義して、必要なときに関数をmain.pyファイルにインポートするだけですか?

+1

あなたがあなたの 'WebScraper'を将来的に使いたいならば、クラスを作ってください。インスタンスをインスタンス化する必要がないように 'classmethod'を実行することもできます。 –

+1

多くの設計上の選択肢と同様に、答えは「それに依存する」よりもはるかに客観的なものではありません。私は[これはいくつかの追加の読書のための質問](http://stackoverflow.com/q/3039889/)を参照したいと思います。 –

答えて

2

クラスと関数の違いは、クラスに状態があるということです。は、である必要があります。いくつかのクラスには状態はありませんが、これはめったに良いアイデアではありません(例外はありますが、抽象基本クラス(ABC)など)がありますが、いくつかの関数は状態を持っていますこれはめったに良い考えではありません(キャッシングや計測は例外かもしれません)。

URLを入力し、出力としてdictと言うと、そのWebサイトで完了すれば、クラスを持つ理由はありません。 URLを受け取り、dictを返す関数を持っているだけです。ステートレス関数はクラスよりも単純な抽象であるため、他のすべてのものが等しい場合はそれらが優先されます。

しかし、非常に頻繁に中間状態が関与している可能性があります。たとえば、ベースURLに根ざしたページのファミリを廃止しているかもしれません。このすべてを熱心に実行するには高価です。多分あなたが望むのは、ルートURLをそのコンストラクタとして取るクラスです。次に、どの子URLに従うことができるかを照会するためのいくつかのメソッドと、ネストされたデータ構造に格納されている子供の後続のスクレイピングを注文するメソッドがあります。

もちろん、あなたのタスクがかなり複雑な場合は、クラスを使用する関数を持つレイヤーまたは関数を呼び出すクラスを持つことができます。しかし、永続状態は、即時タスクをクラスまたは関数セットとして記述するかどうかを示す良い指標です。

編集:ループを閉じて元の質問に戻ります:いいえ、クラス内のすべての関数をラップするのは難色ではないと思います。無料の関数はPythonでちょうどいいです、それはすべて適切なものに依存します。また、ピトンネスクという言葉はあまりpythonではありません;-)

1

あなたは "pythonic"を意味します。

これは、オブジェクト指向、スケーラビリティ、実装の程度に依存します。私は単純な関数よりもクラスを使用します。明日、CraiglistScrapperとFacebookScrapperが必要だと言います...私は抽象クラス "Scrapper"を作成し、上の2つはこのクラスを継承し、必要なもの(多態性)を再実装します。オブジェクト指向の原則とパターンは言語に依存しないということです。今私は "SOLID"という単語を覚えておくたびに、クラス内で「すべての機能を保持する」ことはしません(単一責任の原則)。

関連する問題