質問: BMI(65, 170) a.decide() ``` 自分は*init*を用いなかったのですが、それは短いコードで含まれている関数も少ないことから、インスタンスの作成と同時に実行する初期化メソッドを用いる必要がないと判断しました。 自分の初期化メソッドの解釈を元にすると初期化メソッドを使う時は、クラス内に関数を多く定義する予定で、インスタンスであるaで膨大な関数を扱うときに、それらに共通した変数や処理をそれぞれやるのは効率が悪いから*init*に記述しておいて予め実行させておく。つまり、多くのメソッドを作るときに必要になる変数などを予め定義してそれを参照することで作業を効率化するために初期化メソッドを使う。 という風に考えているのですが、どうでしょうか? 用語の解釈と初期化メソッドの使う場面についての解釈になにか間違いや違和感があれば指摘していただけると幸いです。また、よりよい解釈をご存知ならそれをご教授していただけるととても助かります。 よろしくお願いします。
回答: こんにちは。 認識におおむね問題はないです。 語句の確認と認識の整理のため、以下つらつら書きます。 **オブジェクト**というのは関連する変数とメソッドをまとめたもので クラスオブジェクトとインスタンスオブジェクトがあります。 (「もの」を正確に言うとメモリ上に読み込まれた構造体ですかね) 静的なクラスオブジェクトはそのままでも使えますが、 通常はクラスオブジェクトからインスタンスオブジェクトを生成して使います。 (クッキーの型から、クッキーが生成されるイメージ) インスタンスオブジェクトが生成された**直後**に実行されるのが`__init__ (コンストラクタ)`。 名前の通り初期化処理を行うためのメソッドで、必要がなければ省略しても構いません。 初期化が必要かどうかはクラスの設計によりますが、 **そのクラスを使うためには必ず必要な引数・処理**は`__init__`に組み込んでおくと 使う側が混乱しなくて済みますね(継承するときは特に設計に注意が必要です)。 オブジェクト指向もなかなかに奥が深い。 こういうことを考えられるのはプログラミングに向いてます。