質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

394閲覧

クラス、オブジェクト、インスタンス、メソッド、初期化メソッドの用語の解釈と__init__の使用する場面の解釈が正しいかわからない

gunmed

総合スコア55

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2019/02/07 15:27

編集2019/02/07 15:39

表題通り、教科書を読んでクラスの概念について学習したのですが、自分の理解が正しいのかわからないのと、曖昧な部分があるので、質問させていただきます。今から自分の中の解釈を記述するので、おかしい理解をしているところがあれば、指摘いただけると助かります。
(プログラム初心者で、自分の学習状況はpythonの入門書を1冊終えたレベルで、最近例外処理やデコレータを学習し始めたレベルです)

オブジェクトとは、関数や文字列、整数などなどすべてがオブジェクトであり、オブジェクトでプログラムを作っていく、いわばプログラムのパーツであると解釈しています。(深く考えれば考えるほどわからなくなったので、浅い解釈ですが、結局これに落ち着きました。)

クラスというのはそのオブジェクトの大きな派閥の1つ。
クラスというのはメソッド(クラス内で定義した関数)とプロパティ(クラス内で定義した変数)の集合をまとめているもの。
クラスを作るメリットとしては、あらかじめ自分の使う関数を定義しておけば、使うときにいちいち記述しなくてもすぐにオブジェクト取り出せるという点。

その取り出したオブジェクトをインスタンスという。
例えば、

class Human: def hand(self): pass

とクラスとメソッドを定義して、
a = Human()
とすればaはオブジェクトであり、それはインスタンスでもある。
aを用いて
a.hand
とすることでメソッドを自由に取り出し使うことができる。

初期化メソッドというのは、そのインスタンスを形成した瞬間に実行されるメソッドのこと。
メリットとしては、クラスの中に多くのメソッドを含めていた場合、初期化メソッドの中で、それらに共通する変数を定めておいたり、処理を定義しておくことで作業の短縮化ができるというもの。

以上のような解釈です。

その解釈を用いて、クラス作成の練習としてBMIを算出するクラスを作成する課題を取り組みました。それが以下です。

class BMI: def calcu(self, weight, height): self.weight = weight self.height = height h = self.height / 100 self.result = self.weight / (h ** 2) def decide(self): print('---') print('BMI =', self.result) if self.result < 18.5: print('痩せ型') elif self.result < 25.0: print('標準') elif self.result < 30.0: print('軽度肥満') elif self.result < 35.0: print('重症肥満') else: print('超肥満') a = BMI() a.calcu(65, 170) a.decide()

以下は__init__を使った模範的回答です。

class BMI: def __init__(self, weight, height): self.weight = weight self.height = height self.calcBMI() def calcBMI(self): h = self.height / 100 self.result = self.weight / (h ** 2) def decide(self): print('---') print('BMI =', self.result) if self.result < 18.5: print('痩せ型') elif self.result < 25.0: print('標準') elif self.result < 30.0: print('軽度肥満') elif self.result < 35.0: print('重症肥満') else: print('超肥満') a = BMI(65, 170) a.decide()

自分は__init__を用いなかったのですが、それは短いコードで含まれている関数も少ないことから、インスタンスの作成と同時に実行する初期化メソッドを用いる必要がないと判断しました。
自分の初期化メソッドの解釈を元にすると初期化メソッドを使う時は、クラス内に関数を多く定義する予定で、インスタンスであるaで膨大な関数を扱うときに、それらに共通した変数や処理をそれぞれやるのは効率が悪いから__init__に記述しておいて予め実行させておく。つまり、多くのメソッドを作るときに必要になる変数などを予め定義してそれを参照することで作業を効率化するために初期化メソッドを使う。
という風に考えているのですが、どうでしょうか?

用語の解釈と初期化メソッドの使う場面についての解釈になにか間違いや違和感があれば指摘していただけると幸いです。また、よりよい解釈をご存知ならそれをご教授していただけるととても助かります。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。
認識におおむね問題はないです。
語句の確認と認識の整理のため、以下つらつら書きます。

オブジェクトというのは関連する変数とメソッドをまとめたもので
クラスオブジェクトとインスタンスオブジェクトがあります。
(「もの」を正確に言うとメモリ上に読み込まれた構造体ですかね)

静的なクラスオブジェクトはそのままでも使えますが、
通常はクラスオブジェクトからインスタンスオブジェクトを生成して使います。
(クッキーの型から、クッキーが生成されるイメージ)

インスタンスオブジェクトが生成された直後に実行されるのが__init__ (コンストラクタ)
名前の通り初期化処理を行うためのメソッドで、必要がなければ省略しても構いません。

初期化が必要かどうかはクラスの設計によりますが、
そのクラスを使うためには必ず必要な引数・処理__init__に組み込んでおくと
使う側が混乱しなくて済みますね(継承するときは特に設計に注意が必要です)。

オブジェクト指向もなかなかに奥が深い。
こういうことを考えられるのはプログラミングに向いてます。

投稿2019/02/08 01:51

編集2019/02/08 01:54
firedfly

総合スコア1131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gunmed

2019/02/08 10:08

回答ありがとうございます。 とても説明がわかりやすく、知識が整理されました。 継承もこれから勉強していくので、参考になりました。 今後ともよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問