Pythonクラスとモジュールの違いについて

このQ&Aのポイント
  • Pythonのクラスとモジュールの違いについて説明します。
  • クラスは一つのファイルの中に宣言され、他のモジュールからインスタンスを生成して使用できます。一方、モジュールは別のファイルとして存在し、importすることによって利用できます。
  • クラスとモジュールの使い分けには、コードの構造や可読性の向上などのメリットがあります。具体的な使い分け方やメリット・デメリットについても説明します。
回答を見る
  • ベストアンサー

Python クラスとモジュールの違いについ

プログラミング初心者です。※初めてのプログラミングで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++)として存在しています。

seatool
質問者

お礼

ご回答ありがとうございます。 ご連絡が遅くなり申し訳ございません。 とても詳細に記載頂き、大変参考になりました。 上記で完璧に理解できたわけではないですが、勉強(プログラミング)をするうえで、どこに気をつければよいかが分かりました。(分かった気になっているだけかもしれませんが・・・) これからいくつかプログラムをしていく中でもっと理解を深めていきたいと思います。 ありがとうございました!!

その他の回答 (1)

  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

Pythonは使っていません。ただ、ざっとドキュメントを読んで感じたことです。 認識されている通り、クラスはモジュールの一種のようですね。 必要になるまでは、モジュールとして作成すればいいと思います。 私なら、標準の型を使うだけの処理ならばモジュール(というか関数)、 標準の型の塊を扱うならばクラスを使用します。 クラスを使用することで、データの塊の使用方法に制約を設け、整合性を保証できるからです(カプセル化)。 自分で使用する規模のプログラムだから大丈夫!と、言いたい所ですが、 1週間前に書いたプログラムの制約を覚えていない、なんてことはよくあります。 特に、グローバル変数を呼ぶことは容易ですが、 どこでグローバル変数が呼ばれているかを後で探すのは、かなり手間がかかりますよ。

seatool
質問者

お礼

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

関連するQ&A

  • pythonについて

    私はプログラミングに興味があってmacでpython2.7を使っています。 python2.7でプログラムをファイルを書く方法が分かりません。 また、 python専用の本を持ってるのですが、「test.py」という部分があります。 “テキストエディット”、“AppleScript エディット”で保存するをクリックして 名前を「test、py」にできないのですが「test.py」にする必要はないのでしょうか? どなたかやり方を教えてください。

  • macのPCでpythonでのnumpyエラー

    ラズパイでpythonで作成しているTCP通信のクライアントソフトのプログラミング作業をMacのPC側で行いたいと思っています。それで、tcp_client1_02.pyというファイルをmac側に移して、Python IDLEで開いてRUNしてみたところ、次のようなエラーが出てきました。 >>> =========== RESTART: /Users/****/Desktop/tcp_client1_02.py =========== Traceback (most recent call last): File "/Users/****Desktop/tcp_client1_02.py", line 4, in <module> import numpy as np ImportError: No module named 'numpy' >>> どうも、このプログラム内の配列で使用しているnumpyのモジュールがPCに入っていないようなのですが、インストール方法など解決方法をご教示いただきますよう宜しくお願い致します。

  • Pythonのバージョンアップについて

    CentOS5.5にはPython2.4がデフォルトで入っているのですが、Python2.6でスクリプトを作成する必要がありバージョンアップをしているのですが、dbusモジュールのインポートができず行き詰っております。 具体的には、Python2.4とdbus-pythonがインストールされている状態で、下記のURLを参考にyumでPython2.6をインストールしました。 環境としては「/usr/bin/phthon2.4」と「/usr/bin/phthon2.6」が出来た状態です。 libは「「/usr/lib/phthon2.4」と「/usr/lib/phthon2.6」です。 dbus-pythonのインストール先は「/usr/lib64/python2.4/site-packages/dbus」になります。 Python2.4を環境で下記のインポートは問題ありません。 >>>import dbus しかし、Python2.6環境で同じコマンドを実行すると下記のようなエラーになります。 >>> import dbus Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named dbus dbusの再インストールはリスクが高いと思い、モジュールのパスを通してみたところ下記のようなエラーになりました。 >>> import sys >>> sys.path.append('/usr/lib64/python2.4/site-packages') >>> import dbus Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib64/python2.4/site-packages/dbus/__init__.py", line 1, in <module> from _dbus import * File "/usr/lib64/python2.4/site-packages/dbus/_dbus.py", line 45, in <module> import dbus_bindings ImportError: /usr/lib64/python2.4/site-packages/dbus/dbus_bindings.so: undefined symbol: Py_InitModule4 rpmでモジュールインストール先の変更や、Python自体をソースからインストールなどしてみたのですが、全てうまく行かない状態です。 Pythonバージョンアップ前にインストールされているモジュールの使い方をご存知の方がおられましたら、宜しくお願いします。

  • 標準モジュールとクラスモジュールの違い

    マイクロソフトのAccess2000でVBAプログラミングを行なっておりますが、 基本的なことを教えてください。 「標準モジュール」と「クラスモジュール」の違いはなんですか? 例えば、どこからでも使えるプロシージャ Public Function getSum( i1 as integer, i2 as interger ) getSum = i1 + i2 End Function を定義したとして、標準モジュール内に書くのとクラスモジュール内に 書くのとでは、何が違ってきますか?その他とにかく「標準モジュール」 とクラスモジュールの違いを教えてください。

  • Pythonリリースコンパイル(appとexe)

    お世話になっています. Pythonでプログラム(スクリプト?)を書いています. まず当方の開発環境は, Macintosh(Mac OS X Ver. 10.6.8) プロセッサ 2.7GHz Intel Core i7 です. Pythonをリリースコンパイル(.appと.exe化)したいのですが,やり方が分かりません. すぐに情報がほしいので,以下の1つでもご存知のものがあればご回答をお願い致します. よろしくお願いいたします. 1,【優先順位:高】 ◎pyファイルをapp化したい(利用環境:py2app) py2appを利用し,コンパイルしたのですが全てがコンパイルできません. 以下のモジュールをインポートしています. import sys import time import math import codecs import Tkinter import tkMessageBox import tkFileDialog as tkFileDialog import thread app化されたファイルを開くと,Windowは表示されるのですが機能しません. ボタンをクリックするとファイルを読み込み,データを計算し書き出すコードなのですが, その処理が一切されません. 2,【優先順位:高】 ◎pyファイルをapp化したい(利用環境:py2app) py2appを利用し,コンパイルしたのですが全てがコンパイルできません. 以下のモジュールをインポートしています. import sys import time import math import codecs import Tkinter import tkMessageBox import tkFileDialog as tkFileDialog import MeCab import thread app化されたファイルを開くと,Windowは表示されるのですが機能しません. ボタンをクリックするとファイルを読み込み,データを形態素解析し,それを計算したものを書き出すコードなのですが, その処理が一切されません. 3,【優先順位:中】 ◎pyファイルをexe化したい(利用環境:py2exe) py2exeを利用し,コンパイルしたいです. 以下のモジュールをインポートしています. import sys import time import math import codecs import Tkinter import tkMessageBox import tkFileDialog as tkFileDialog import MeCab import thread 上の2をexe化したいのですが,そもそもapp化が出来ないのでまだ実験していません. やり方をご存知のかたがいらっしゃいましたらこちらの回答もお願い致します. ------------------- 現在,py2appのみの実験ですが,別にapp化出来るのであればどのようなものを使っても大丈夫です. 何か他のツールをご存じの方がいらっしゃいましたらご教授お願い致します. よろしくお願いいたします.

  • Pythonで、C言語のモジュールを利用したい!

    初めまして。 どなたか回答いただければ幸いです。 Pythonで利用できるモジュールを、C言語で作成したいと思っているのですが、方法が良くわかりません。 現在、Windowsで、CygwinのGCCを用いて、C言語をコンパイルしています。 GCCでコンパイル→DLLファイル作成→Pythonで利用? という大まかな流れかな~と思いまして、 見よう見まねで、 $gcc -shared test.o -o testmodule.dll というコマンドでDLLファイルを作成して、それをPythonで認識できるフォルダに格納して、Pythonのプロンプトで、 >>>import testmodule(あるいは、import testmodule.dll) とかやったのですが、 ImportError: DLL load failed: 指定されたモジュールが見つかりません。 と言われてしまいました。 鋭意調査中ですが、ご存知の方がおられましたら、 ご教授お願いいたします。

  • Pythonでのimport

    Pythonで、 from enthought.traits.api import HasTraits をしようとすると、 No module named enthought.traits.api とエラーがでるのですが、どうしたらいいのでしょうか。 詳細: 知人の.pyファイルをもらって起動させようとすると、どうやら上の行で躓いてしまいます。 Pythonは2.6でwindows 7を使用しています。 説明が少なくてすみません。

  • PythonとRubyどちらを選ぶべきでしょう?

    こんにちは。 今、PythonとRubyどちらをメインで学ぶべきかを考えており良かったら皆様の意見を参考にしたく思います。 現状 Ruby 7ヶ月 Python 1ヶ月 ほどの経験があります。(プログラミングはまだ初心者です。) Rubyの方が慣れているのですが、以下のような考えからPythonをメインで使った方がいいのか考えています。 以下、僕の考え 今後、Ruby on Railsがどんどん使われだして、現在のPHPのような形でRubyが使われるんじゃないか。 とすると、Rubyを使っても他の人と全く差別化出来ない取り替えの効いてしまうプログラマにしかなれないのでは。 Pythonの場合は、まだ日本でのユーザー数が少ないこともあり、Ruby,PHPに比べれば自分を差別化することにつなげられるのではないか。 とすれば、Pythonを使った方がいいか? ちなみにコレ以外に今思っていることとして、 Pythonはモジュールをインポートすることが前提とされているため、モジュールを効率的に利用する方法が学びやすい。そのため、プログラミングの学習には向いている。 PythonにもturbogearsやDjangoがあるので、Railsが無くてもいいのでは? Google app engineの登場で、Python学習に都合の良い場所が出来た。 といったことです。 これらの考え方について皆様はどのように思われますか?逆にPythonやRubyよりもCやPerlをやった方がいいんじゃないかといった意見もありましたら頂けると嬉しいです。よろしくお願いします。 (追記)ちなみに僕は今学生で、就職先ではきっとPHPを使うことになります。(ホントはあまり使いたくないのですが)

  • pythonのプログラムを走らせるには?

    使用するソフトウェアの関係でWeb(HTMLまたはPHP)とPythonの連携が必要になりました。 しかしPythonをWebで扱ったことがなくいまいちどうしたらいいのか分りません。 <form action="/python/pythontest.py" method="GET">  <input type="submit" name="submit" value="更新"> </form> といった形で呼び出しているのですがファイルが開かれるだけでptythonのプログラムが実行されません。 pythonのプログラムは #!/usr/bin/env python # coding: utf-8 import cgi from datetime import datetime html_body = u""" <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> </head> <body> %s </body> </html>""" content='' print "Content-type: text/html;charset=utf-8\n" print (html_body % content).encode('utf-8') と書いています。 何が原因なのでしょうか? /usr/bin/env python のパスがうまく通っていないからでしょうか?

    • ベストアンサー
    • HTML
  • python urlopen error について教えてください

    pythonを、勉強したてです。 開発環境は、python2.6/win XP です。 HTMLを解析するために、 http://www.crummy.com/software/BeautifulSoup/ からライブラリーを入手して、C:\Python26\Lib\site-packages\BeautifulSoup-3.1.0.1 に配置しました。 python環境設定のパスは、通してあります。 プログラムは、http://www.freia.jp/taka/blog/169 の「myparser.py」をそのまま使いました。(動作テストのため) ------- 結果 -------- メッセージ ファイル名 行 位置 Traceback <module> C:\Python26\src\myparser.py 50 main C:\Python26\src\myparser.py 41 urlopen C:\Python26\Lib\urllib2.py 124 open C:\Python26\Lib\urllib2.py 383 _open C:\Python26\Lib\urllib2.py 401 _call_chain C:\Python26\Lib\urllib2.py 361 http_open C:\Python26\Lib\urllib2.py 1130 do_open C:\Python26\Lib\urllib2.py 1105 URLError: <urlopen error [Errno 11001] getaddrinfo failed> ネットワーク環境は、プロキシ・サーバを返していますが、どうやっても上記のエラーで引っ掛かってしまいます。

専門家に質問してみよう