
プログラミング初心者です。※初めてのプログラミングでPythonの勉強中です。開始2週間程度です!!
Pythonにおける(プログラム一般における?)クラスとモジュールの違いが分かりません。
■現状の認識
・モジュール
「***.py」といったような一つのファイル
他のモジュールからimportすることによって使用できる
・クラス
「***.py」といった一つのファイルの中に「class」として宣言できる
他のモジュールからインスタンスを生成して使用できる
■疑問点
上記を使い分ける意味
上記を使い分けた時のメリット、デメリット
※すべてモジュールとして作成して、使用したいときにimportすればいいのでは?と考えています。
現状Pythonの知識しかありませんが、プログラミング一般の知識のような気がしています。
プログラムに詳しい方よろしくお願い致します。
No.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++)として存在しています。
ご回答ありがとうございます。
ご連絡が遅くなり申し訳ございません。
とても詳細に記載頂き、大変参考になりました。
上記で完璧に理解できたわけではないですが、勉強(プログラミング)をするうえで、どこに気をつければよいかが分かりました。(分かった気になっているだけかもしれませんが・・・)
これからいくつかプログラムをしていく中でもっと理解を深めていきたいと思います。
ありがとうございました!!
No.1
- 回答日時:
Pythonは使っていません。
ただ、ざっとドキュメントを読んで感じたことです。認識されている通り、クラスはモジュールの一種のようですね。
必要になるまでは、モジュールとして作成すればいいと思います。
私なら、標準の型を使うだけの処理ならばモジュール(というか関数)、
標準の型の塊を扱うならばクラスを使用します。
クラスを使用することで、データの塊の使用方法に制約を設け、整合性を保証できるからです(カプセル化)。
自分で使用する規模のプログラムだから大丈夫!と、言いたい所ですが、
1週間前に書いたプログラムの制約を覚えていない、なんてことはよくあります。
特に、グローバル変数を呼ぶことは容易ですが、
どこでグローバル変数が呼ばれているかを後で探すのは、かなり手間がかかりますよ。
ご回答ありがとうございます。
ご連絡が遅くなり申し訳ございません。
型の塊、標準の型、ローカル変数、グローバル変数・・・あれから勉強をしたらざっくりですがイメージができるようになりました。
整合性の保証等についてもっと勉強してみます!!
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのバージョン変更に関する質問 1 2023/02/14 11:39
- その他(プログラミング・Web制作) Pythonのライブラリ、randomについて 3 2022/09/20 14:30
- Perl Perl の外部モジュールの利用方法 3 2022/07/10 18:34
- その他(プログラミング・Web制作) Pythonについて教えて下さい 2 2022/08/18 19:03
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- その他(ブラウザ) pythonの既定のブラウザを変更したいです 1 2022/07/06 22:09
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- Java マイクラでPythonのプログラミングができません 3 2023/05/28 07:15
- バッテリー・充電器・電池 AC-DC電源モジュールの選択について教えてください 3 2022/04/24 11:44
- 一眼レフカメラ SFP モジュールについて 1 2023/06/04 14:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Form2の変数をForm1に渡す方法...
-
オブジェクト指向とは?
-
VBAで、Functionを、クラスモジュール...
-
現在使用しているJAVAファイル...
-
VB.netで、動的な型変換を行い...
-
VB6で外部から静的アクセスが可...
-
【.NET】DataSetについて
-
[VBA] Classから他のClassを呼...
-
VBA(エクセル)で自動的にボタン...
-
VBA シートのボタン名を変更し...
-
worksheetFunctionクラスのVloo...
-
実行時エラー -'-2147417848
-
「Columns("A:C")」の列文字を...
-
実行時エラー 438になった時の...
-
ユーザーフォームを表示中にシ...
-
カメラスクロールするのを動画...
-
Excel VBA で End Subのところ...
-
なぜこんな初歩的なVBAのIf文で...
-
セルをマクロのボタンにしたい。
-
パソコンへの「Dropbox...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[VBA] Classから他のClassを呼...
-
共通モジュールでDBへの接続と...
-
他のモジュールのプロシージャ...
-
用語の意味の違いを教えてくだ...
-
VB.netで、動的な型変換を行い...
-
Excel vbaで複数のテキストボッ...
-
VB.NETにて文字列で指定した関...
-
WPFでCanvas の子要素にアクセ...
-
バウンドプロパティとは?
-
VBAで、Functionを、クラスモジュール...
-
VB6で外部から静的アクセスが可...
-
Visual-C#の event キーワー...
-
【JSF】バッキングビーンから別...
-
VBA オブジェクト追加
-
C# Process.Start で標準入力
-
オブジェクト指向とは?
-
【.NET】DataSetについて
-
C#でのWebRequestでのPOSTについて
-
Python クラスとモジュールの...
-
'StructLayout' の仕様について
おすすめ情報