表題通り、教科書を読んでクラスの概念について学習したのですが、自分の理解が正しいのかわからないのと、曖昧な部分があるので、質問させていただきます。今から自分の中の解釈を記述するので、おかしい理解をしているところがあれば、指摘いただけると助かります。
(プログラム初心者で、自分の学習状況は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__に記述しておいて予め実行させておく。つまり、多くのメソッドを作るときに必要になる変数などを予め定義してそれを参照することで作業を効率化するために初期化メソッドを使う。
という風に考えているのですが、どうでしょうか?
用語の解釈と初期化メソッドの使う場面についての解釈になにか間違いや違和感があれば指摘していただけると幸いです。また、よりよい解釈をご存知ならそれをご教授していただけるととても助かります。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/08 10:08