電子書籍の厳選無料作品が豊富!

プログラミング初心者です。※初めてのプログラミングでPythonの勉強中です。開始2週間程度です!!

Pythonにおける(プログラム一般における?)クラスとモジュールの違いが分かりません。

■現状の認識
・モジュール
「***.py」といったような一つのファイル
他のモジュールからimportすることによって使用できる

・クラス
「***.py」といった一つのファイルの中に「class」として宣言できる
他のモジュールからインスタンスを生成して使用できる

■疑問点
上記を使い分ける意味
上記を使い分けた時のメリット、デメリット

※すべてモジュールとして作成して、使用したいときにimportすればいいのでは?と考えています。


現状Pythonの知識しかありませんが、プログラミング一般の知識のような気がしています。
プログラムに詳しい方よろしくお願い致します。

A 回答 (2件)

プログラミング言語の一般的な質問だと思います。


モジュール、クラスの現状の認識は合っていると思いますが、その包含関係を理解していないように思います。モジュールはクラスやメソッド、その他のデータをまとめたものです。

実際のPythonのモジュールだと、stringを見ると雰囲気がつかめるかもしれません。stringにはascii_lettersのような定数値からcapwordsのような関数、Formatterのようなクラスまで含まれていて、これらはすべて文字列の操作に関するものです。

> 上記を使い分ける意味

クラスは内部にデータを持つことができ、そのインスタンスごとに別のデータが入っていますが、そういうことはモジュールではできません。例えば、string.Templateは各々のインスタンスごとに別々のテンプレートを持たせることができますが、モジュールだとそもそもインスタンスを作れません。

クラスを使う意義は2つあって、先に述べたインスタンスごとに別々の一連のデータを作れ、メソッドを通してしかそれらのデータにはアクセス出来ないということと、ダイナミックディスパッチがあります。ちなみに、_や__をフィールド名やメソッド名の最初につけるとそれぞれ自分とサブクラスのみ参照可能、自分のみ参照可能として扱うという紳士協定があります。 (Javaなどと違って特別な方法を使わずに簡単にそれらのデータは触れますが)

Pythonの標準モジュールでダイナミックディスパッチをうまく使っている例をちょっと見つけられませんでしたが、ダイナミックディスパッチでよく出てくる例はドローソフトですね。ドローソフトでは四角、三角、円、直線などそれぞれにdraw()などのメソッドが定義されていて、それが呼ばれるとキャンバスに図形を描くようになっています。それら全てはFigureインタフェースを継承していて、Figureインタフェースでは中身が入っていないdraw()が定義されていて、四角、三角、縁、直線のクラスにあるdraw()メソッドに実際にキャンバスに描くというプログラムが書いてあります。
別の例を出すと、HTTPサーバーとHTTPSサーバーの両方でリクエストを受け付けていて、接続されるとそれぞれの処理用のクラスのインスタンスを渡すというような場合、実際の処理はHTTPとHTTPSで異なりますが、同一のインタフェースにしておくのが普通です。この時、HTTPRequestなどのクラスのサブクラスとしてHTTPSRequestを定義するということはよく行われるでしょう。
Pythonの場合はクラスの継承関係がなくても同じメソッド名があると呼べてしまうのであまりダイナミックディスパッチを意識したプログラムを書くメリットを感じないかもしれませんが、そういう作り方をしていたほうがどういう意図でプログラムが組んであるのかわかりやすいと思います。

> 上記を使い分けた時のメリット、デメリット

別のものなので使い分けて当然です。
モジュールがあることで一連の処理を一発でimportできますし、クラスがあることでデータとその処理をバラバラにせずに扱えます。また、クラス抜きでオブジェクト指向プログラミングをするのは非常に困難です。

モジュール化で一番考えないといけないのは、関連するものを密に結合させて、関連しないものを疎に結合させることです。モジュールはそれのお手伝いをするちょうどいい感じの壁でしょう。ちなみに、モジュールに当たる概念は他のプログラミング言語でもpackage (Java)やmodule(Ruby、Perl)、namespace (C++)として存在しています。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご連絡が遅くなり申し訳ございません。

とても詳細に記載頂き、大変参考になりました。
上記で完璧に理解できたわけではないですが、勉強(プログラミング)をするうえで、どこに気をつければよいかが分かりました。(分かった気になっているだけかもしれませんが・・・)

これからいくつかプログラムをしていく中でもっと理解を深めていきたいと思います。

ありがとうございました!!

お礼日時:2012/12/25 00:35

Pythonは使っていません。

ただ、ざっとドキュメントを読んで感じたことです。
認識されている通り、クラスはモジュールの一種のようですね。
必要になるまでは、モジュールとして作成すればいいと思います。

私なら、標準の型を使うだけの処理ならばモジュール(というか関数)、
標準の型の塊を扱うならばクラスを使用します。
クラスを使用することで、データの塊の使用方法に制約を設け、整合性を保証できるからです(カプセル化)。
自分で使用する規模のプログラムだから大丈夫!と、言いたい所ですが、
1週間前に書いたプログラムの制約を覚えていない、なんてことはよくあります。
特に、グローバル変数を呼ぶことは容易ですが、
どこでグローバル変数が呼ばれているかを後で探すのは、かなり手間がかかりますよ。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご連絡が遅くなり申し訳ございません。

型の塊、標準の型、ローカル変数、グローバル変数・・・あれから勉強をしたらざっくりですがイメージができるようになりました。
整合性の保証等についてもっと勉強してみます!!
ありがとうございました。

お礼日時:2012/12/25 00:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!