マルシェル新規登録で5000円分当たる

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

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

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

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

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

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


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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aと関連する良く見られている質問

Qモジュールとクラスの違いってなんなんですか?

モジュールとクラスの違いってなんなんですか?

本などをみてもいまいち分かりません。

Aベストアンサー

端的かつ正確に言うと、クラスはオブジェクトで、標準モジュール(質問内でモジュールと呼んでいるのは標準モジュールのことだと思いますが)はオブジェクトではありません。
(もし、質問内でモジュールと呼んでいるのが、本当にモジュールという意味で言っているのであれば、クラスはクラスモジュールですし、フォームはフォームモジュールです。クラスはモジュールの一種です、という答えです)
使用方法で言うと、クラスはインスタンス作成時、破棄時にそれぞれイベントが発生するため、変数等の初期化や終了処理などをオブジェクト内で自動化できます。
オブジェクト内で自動化されるため、初期化手続き、参照の開放などクラスを使用する際には内部の動作を意識することなく使用することができます。
つまり、再利用性が高いと言いかえることができます。
また、VB5/6ではAddressOf演算子が標準モジュール内の関数以外には使用できないという制限があるが、それを使用しない前提では、標準モジュールで実現できることはクラスで書きかえることができます。
逆に、クラスではできる事でも、標準モジュールではできないことは山のようにあります。
#1さんが書いたように、複数のインスタンスを作成することもそうですが、当方の利用方法では、コレクションに追加できるという点を挙げたいと思います。他には、自己再起定義(造語)です。ClassA内でClassAオブジェクトを作成するような動作です。ClassA内でClassAを定義した場合、中に作成されたClassAの中にさらにClassAが定義可能で、さらにその内部にClassAが、さらにその内部に・・・と、スタックの許す限り無限に定義されます。
ポリモーフィズム、関数の引数や返り値にクラスを渡すなど、いろいろと標準モジュールには不可能な点が多くあります。

端的かつ正確に言うと、クラスはオブジェクトで、標準モジュール(質問内でモジュールと呼んでいるのは標準モジュールのことだと思いますが)はオブジェクトではありません。
(もし、質問内でモジュールと呼んでいるのが、本当にモジュールという意味で言っているのであれば、クラスはクラスモジュールですし、フォームはフォームモジュールです。クラスはモジュールの一種です、という答えです)
使用方法で言うと、クラスはインスタンス作成時、破棄時にそれぞれイベントが発生するため、変数等の初期化や終了処...続きを読む

Qエクセルで計算すると2.43E-19などと表示される。Eとは何ですか?

よろしくお願いします。
エクセルの回帰分析をすると有意水準で2.43E-19などと表示されますが
Eとは何でしょうか?

また、回帰分析の数字の意味が良く分からないのですが、
皆さんは独学されましたか?それとも講座などをうけたのでしょうか?

回帰分析でR2(決定係数)しかみていないのですが
どうすれば回帰分析が分かるようになるのでしょうか?
本を読んだのですがいまいち難しくて分かりません。
教えてください。
よろしくお願いします。

Aベストアンサー

★回答
・最初に『回帰分析』をここで説明するのは少し大変なので『E』のみ説明します。
・回答者 No.1 ~ No.3 さんと同じく『指数表記』の『Exponent』ですよ。
・『指数』って分かりますか?
・10→1.0E+1(1.0×10の1乗)→×10倍
・100→1.0E+2(1.0×10の2乗)→×100倍
・1000→1.0E+3(1.0×10の3乗)→×1000倍
・0.1→1.0E-1(1.0×1/10の1乗)→×1/10倍→÷10
・0.01→1.0E-2(1.0×1/10の2乗)→×1/100倍→÷100
・0.001→1.0E-3(1.0×1/10の3乗)→×1/1000倍→÷1000
・になります。ようするに 10 を n 乗すると元の数字になるための指数表記のことですよ。
・よって、『2.43E-19』とは?
 2.43×1/(10の19乗)で、
 2.43×1/10000000000000000000となり、
 2.43×0.0000000000000000001だから、
 0.000000000000000000243という数値を意味します。

補足:
・E+数値は 10、100、1000 という大きい数を表します。
・E-数値は 0.1、0.01、0.001 という小さい数を表します。
・数学では『2.43×10』の次に、小さい数字で上に『19』と表示します。→http://ja.wikipedia.org/wiki/%E6%8C%87%E6%95%B0%E8%A1%A8%E8%A8%98
・最後に『回帰分析』とは何?下の『参考URL』をどうぞ。→『数学』カテゴリで質問してみては?

参考URL:http://ja.wikipedia.org/wiki/%E5%9B%9E%E5%B8%B0%E5%88%86%E6%9E%90

★回答
・最初に『回帰分析』をここで説明するのは少し大変なので『E』のみ説明します。
・回答者 No.1 ~ No.3 さんと同じく『指数表記』の『Exponent』ですよ。
・『指数』って分かりますか?
・10→1.0E+1(1.0×10の1乗)→×10倍
・100→1.0E+2(1.0×10の2乗)→×100倍
・1000→1.0E+3(1.0×10の3乗)→×1000倍
・0.1→1.0E-1(1.0×1/10の1乗)→×1/10倍→÷10
・0.01→1.0E-2(1.0×1/10の2乗)→×1/100倍→÷100
・0.001→1.0E-3(1.0×1/10の3乗)→×1/1000倍→÷1000
・になります。ようするに 10 を n 乗すると元の数字になるた...続きを読む

Q[python] 文字列を変数名として使いたい

すいません教えて下さい。

pythonで以下の変数をセットしています。

aaa = 'hensu_name'

aaaで指定した'hensu_name'に対して値を入れたい場合は
どのように実装すればよいでしょうか?
(aaaに入れたstringを変数名にしたい)

よろしくお願いします。

Aベストアンサー

exec関数を使って文字列をコードとして実行すれば、それっぽいことができるように思います。
あまりいい例を思いつかないですが、以下のような感じでしょうか?

aaa = "hensu_name"
src = aaa + " = 'hello'" #srcの中身は、"hensu_name = 'hello'"

exec(src)
print hensu_name #hello が表示される

src = "print " + aaa #srcの中身は、"print hensu_name"
exec(src) #hello が表示される


ただ、No.1の方がおっしゃっているように、あまりお勧めな方法ではありません。
文字列をコードとして実行してしまうので、少々危険な側面もあります。
悪意のあるコードを含む文字列を実行してしまうとか…。

Qpython print文のエラー

こんにちは。
今日、リカバリしたばかりのPCに、python3.1をインストールしコマンドラインモードからテスト代わりに

「print "Hello world!"」

と打って実行してみました。
しかし、「SyntaxError: invalid syntax」とエラーが出ます。
「print "Hello world!"」の最後の「"」でエラーが発生していると出たのですが、どういうことなのでしょうか。

pythonは始めたばかりで、参考書で最初に書いてあったのを実行してみたのですが…。しょっぱなからこれだと残念です。私の環境が悪いのかも知れませんが。

プログラミング経験はC、C++で中規模のアプリケーション、2Dゲームを作成した程度です。

お願いします。

Aベストアンサー

現時点でのPythonの書籍はおそらくver2.x用だと思いますが、Python3からいくつか文法が変更されています。
http://docs.python.org/3.0/whatsnew/3.0.html

printは、以前は構文でしたが、関数になったので、カッコが必須です。
print("Hello world!")

QMacターミナルで実行中のプログラムを中止するには?

Macのターミナルでプログラムを走らせているとき、
実行中のプログラムを一時停止したり中断・終了させるには
どうしたらいいでしょう?

Unixだと、Control+s とか Control +c とかでできますよね。
Macだと、それではできないみたいなんです。

基本的な質問ですみませんが、どなたか教えていただけないでしょうか。

Aベストアンサー

ごく普通にControl + Cで中断できますよ。

もしかしてControlキーをcommandやcapslockと押し間違えているとかいうことはありませんか?

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

Qモジュールとは何ですか

モジュールとは具体的には何を指しているのか、をお聞きします。

手元のカタカナ語辞典では
「プログラムを、それぞれ特有の機能を持ついくつかの基準単位に分割すること。また、その基準単位。」
と書いてありました。

そうすると、1つ1つのソースファイルを指しているように思えてきます。

いままで私が人がしゃべっているのを聞いてきたところでは、Windowsでいうところの、exeファイルやdllファイルを指しているような気がします。

「モジュール」という言葉は gooの新語辞典にも載っています。
また、コンピュータ用語辞典のようなサイトも見てみました。
それらによると、「ソフトウェア・ハードウェアの部品」だそうです。
しかし、例えば何のことをいっているのかが、分からないのです。

#ファイルなら何でもいいのだろうか。

この言葉の用例を教えていただきたいのです。

============================
過去の質問と回答より。


http://oshiete1.goo.ne.jp/kotaeru.php3?q=302590
回答No.1の補足より。
>モジュールはAccessの標準モジュールのことです

わたしはAccessのことをほとんど知らないので、ハテナです。


http://oshiete1.goo.ne.jp/kotaeru.php3?q=293234
こちらのNo.2の回答では、
dllとは「共通モジュール=ライブラリ」である、
という使い方ですので、例えばdllのことを指しているようです。

モジュールとは具体的には何を指しているのか、をお聞きします。

手元のカタカナ語辞典では
「プログラムを、それぞれ特有の機能を持ついくつかの基準単位に分割すること。また、その基準単位。」
と書いてありました。

そうすると、1つ1つのソースファイルを指しているように思えてきます。

いままで私が人がしゃべっているのを聞いてきたところでは、Windowsでいうところの、exeファイルやdllファイルを指しているような気がします。

「モジュール」という言葉は gooの新語辞典にも載ってい...続きを読む

Aベストアンサー

「モジュール」と言う言葉には「ソフトウェアの部品」という以上の共通概念はありません。
よって、使用される文章の前後関係によって微妙に意味合いが変ってきます。

1.関数、手続き
「mainモジュール」など
2.機能単位でまとめられたライブラリのメンバー
「標準関数ライブラリ(UNIXならlibc.a)に含まれるstdio関係の関数群」など
3.実行ファイルを構築するための個々の素材ファイル
「ソースファイル」、「オブジェクトファイル」、「ライブラリファイル」など
4.実行環境を構成する個々の実行可能ファイル
「exeファイル」、「dllファイル」など
5.(オブジェクト指向型言語において)クラス

モジュールは機能で分類されていると言う保証はありません。
「stdioを構成する個々の関数」を関数モジュールと言う場合もあります。

モジュールと言う単語を使い場合、「関数モジュール」とか「ライブラリモジュール」と言うように、モジュールと言う言葉の曖昧さを保管するような単語と組み合わせて使う用に心がけた方が安全です。

Qレッドハットのバージョン確認方法

自分のサーバで使用しているREDHATのバージョン確認はどうすればいいのでしょうか?

more /etc/issue
とやっても英文しか出てきませんでした。

uname -all
でもカーネルのバージョンは出るのですが、REDHATのバージョンは出ませんでした。

Aベストアンサー

> more /etc/issue
> とやっても英文しか出てきませんでした。

その英文にはRedHatのバージョンは書いてなかったのですか?
書いていなかったとしたら、管理者により編集されている可能性
がありますね。

cat /etc/redhat-release

ではいかがでしょう?
やっぱり英文ですけど。

rpm -q redhat-release

でもいいかも

Q「採用担当御中」か「採用担当様」、どちらが正しいか。

会社にエントリーシートを郵送する時、宛先が「~株式会社 採用担当宛」となっていたら、「採用担当御中」ではなくて、「採用担当様」と書いて送った方がいいのでしょうか?

Aベストアンサー

「御中」は 担当部署宛 担当者不明の場合。
今回の場合は担当者がわかっているので「○○様」とします。


人気Q&Aランキング