練習問題
例1

まず基本的なプログラムから学びましょう。
実体で考えやすくするために自分自身を対象としてクラスを設計していきます。
まずMy_Dataクラスという名前のクラスを作ります。
その中には自分の名前と表示させるためのメソッドMy_Nameを入れておきます。
My_Nameの中にはMy_Nameがする動きを入れます。
自分の名前を表示させるためにはMy_Nameの中にprint "○○○○"(○の中には名前を書く)と書きます。
これでMy_Dataクラスの部分は完成です。
クラスとオブジェクトの章で説明したように書くと
ここではMy_Dataクラスが設計図となりMy_Nameは部品となります。
クラスの外にある変数aは名前空間の章で説明したようにルールに従ってつけなければなりません。
aは名前空間の区分ではグローバル変数とビルトイン変数に属しています。
そのためにprintやdefといった変数名を使う事はできません。
名前空間についてわからなければ名前空間の章を見て復習してください。
a = My_Data()やa.My_Name()のカッコ()は何もない場合でも書いてください。
()内には引数の値を入れたり、継承を行う際に記述したりします。
これは継承の章で説明した通りです。
[注意]ファイルの保存の際の注意事項[注意]
Windowsで行う場合は,ファイルの保存形式をS JIf,エンコードはShift_JISにする。
knoppix(Unix)で行う場合は,ファイルの保存形式をEUC,エンコードをeuc-jpにする。
問題 例を参考にして性別を表示できるプログラムを作ってみましょう。
例1を参考にして名前と性別を表示できるプログラムを作ってみましょう。
※解答例はあくまで例です。メソッド名は自由にしても大丈夫ですが名前空間には気をつけてください。
下の画像は解答例です。

練習問題2
例2


クラスはモジュールと同じように使うことができます。
クラスの部分とプログラムの部分の2つの新しいファイルに分けます。
分ける際には以下のように書きます。
formの所にはファイルの名前を書きimportの部分にはクラス名を書きます。
[注意]ファイルの階層[注意]
下は二つのファイルを同じ階層に置いています。
エラーがでる場合は階層かどうか確認してください。
問題 例2を参考にして名前と性別がでるプログラムも二つに分けてみましょう。
下は解答例です。


練習問題3
例3
次に名前をクラスの中に書くのではなく、クラス外から書き込めるような形に変えます。
クラス外から書き込めるようにするのは以下のようにプログラムを書きます。


問題3 例3を参考にして名前はクラス内にで書き、血液型と性別はクラス外で書けるプログラムを作りなさい。
下の図は解答例です。


練習問題4
例4
ここでは特殊メソッド__init__()と__str__()を活用してプログラムをコンパクトにして見ましょう。
まずclass_My_Data.pyから見ていきます。


_init__()はメソッドの章でも説明したように特殊メソッドです。
__init__()を使うとインスタンスを初期化をします。
簡単に説明すると__init__()内の内容を一番最初に処理(引数の定義や必要なインスタンスオブジェクトの生成)をします。
つまり一番最初に行ってほしい処理はここでしてます。
ここではMy_Nameという引数に入る値をself.MY_NAMEという変数に入れました。
これをしっかり覚えておいてください。
__str__()も同じく特殊メソッドです。引数はselfだけを入れます。
この__str__()はオブジェクトを文字列に変換するメソッドです。
その際にはprintを使わずにreturnを使います。
self.MY_NAMEはまた新たな変数になります。これは名前空間の区分ではローカル変数にあたります。
つまりMy_Dataクラス内の変数なのでクラス内ではそのまま同じ変数を利用できます。
My_Dataクラス内なのでたとえ__str__()の中だとしても変数は同じままです。
そのため、__init__()内で作ったMy_NAMEと同じインスタンスオブジェクトが__str__()で返されます。
次にMy_Data.pyのプログラムに移ります。
いつものように変数aの中にMy_Dataクラスを入れます。
ここで注目する事は、My_Dataクラス内の__init__()で(self,My_Name)と引数を当てた事です。
selfはメソッドの中でインスタンスを作りたい時に使う引数にです。
実際には第2引数から呼び出されます。
ここではMy_Nameが第2引数になるので a = My_Data("○○○○")と書くと第2引数に名前となります。
クラス内で第2引数は一番最初に__init__()で定義したものに適用されます。
よってまずクラス内では最初に名前 = My_Name が成り立ちます。
次にMy_Nameはself.MY_NAMEという変数に入れられます。
そして__str__()で変数self.MY_NAMEを文字列に変えて、returnで値を返しています。
ここでまで説明しましたがわからない場合は
もう一度実践問題の前の章に戻るかまたは例4のプログラムと文章をよく見て、よく読んで勉強してください。
ここが理解できないと先に進んでも確実に詰まります。
理解できるまでよく読みましょう。
問題4 例4を参考にして、自分の名前以外に性別・血液型もかけるようにしてみましょう。
下の図は解答例です。


練習問題5
例5
今まではprint a で出力してきました。
ここではMy_Dataクラスの中にaをプリントさせるためのメソッドを作ります。
まずメソッド名ですが、printのようにグローバル変数と同じ名前は使わないようにします。
例ではMy_Data_displayというメソッド名にしました。
他でメソッド名をつける際には名前空間に気をつけてつけてください。
My_Data_displayにはprintだけを入れます。
これによってprintだけを行うメソッドが完成します。
print "" の ""の中に表示したい内容を書きます。
%sは文字列を表していて、(self.My_NAME,self.My_NATURE)は書いた順番に対応しています。
%sに対応した変数の中身は文字列に変かわります。
%sの数と変数の数が合わないとエラーが発生します。
例4では、__str__()で変数を文字列に変えてきましたが
My_Data_displayのメソッド内で文字列に変換しているので消してしまいます。
あとはプログラム部分の最後にa.My_Data_display()と書けば完成です。


問題5
例5を参考にして名前・性別・血液型・年齢・生年月日がMy_Data.pyで書けて表示できるようにしましょう。
下の図は解答例です。


練習問題6
例6
ここでは継承の例を出したいと思います。
継承がわからない場合は継承の章に戻って勉強しましょう。
My_Dataクラスは自分自身だと考えてください。
それを継承するわけですから自分と関係があるもとでないと駄目です。
まず自分自身が大谷大学生だとします。
関係としては大谷大学生の中に自分がいます。
これは当たり前ですがしっかり覚えておいてください。
例では大谷大学生(Otani_Student)というクラスを作っています。
これに自分自身(My_Data)を継承させます。
例として学部・学科を作ってました。
My_Dataクラスの変数がOtani_Studentクラスの中でも使えてるのが例6を見てもらえたわかると思います。
しかしその際にはまずOtani_Student():の()中にはMy_Dataと書かなければなりません。
これを書くことで継承がなされます。ここではまず簡単な継承だけを行います。
例5では1つだけ継承を行いますが複数のクラスを継承したい場合(多重継承)は( , )で区切ってください。
Otani_Studentクラスの__init__()のブロック内で
My_Data.__init__(self,My_Name,My_Nature)と書かれているのに注目してください。
これはクラス名.メソッド名(引数)の順番で書かれています。引数はMy_Dataクラスの引数が使われています。
こう書くことでMy_Dataクラスの変数の継承がなされてOtani_Studentクラス内でもMy_dataの変数が使えるようになります。
継承がされた場合、変数だけでなくメソッドも使用できます。
例6のMy_Data.pyではOtani_Studentクラスのメソッドだけでなく
My_Dataクラスのメソッドも使っていています。(My_Data_Display)
これはOtani_StudentクラスがMy_Dataクラスを継承しているからです。
つまり継承すればするほど継承されたクラスは機能が増えます。
継承の章の説明でいうと自分自身(My_Dataクラス)がスーパークラスとなる。
大谷大学生(Otani_Studentクラス)がサブクラスとなります。
そのためここからimportするものはMy_DataではなくOtani_Studentと書きましょう。
このあたりから変数間違い・引数間違いが続出します。タイプミスには気をつけましょう。


問題6
例6を参考にしてMy_Dataクラスに名前・性別・血液型・年齢・生年月日を
Otani_studentクラスに、学部・学科・学年・学籍番号・ゼミを足しなさい。
それができたらMy_DataクラスをOtani_Studentクラスに継承して、Otani_Studentクラスだけですべて表示しなさい。
下の図は解答例です。


練習問題7
例7
ここまででクラスの使い方の説明は終わりです。
ここからは例は必要なものだけを作ってできるだけ小さくプログラムしていきます。
ここからが実践問題の章の本題となっていきます。
次の問題からは、実体のある例ではなく実体のないものでプログラムしていきます。
※\nは改行になります。
※クラス内の変数はself.allにしていますが、そこは好きにしてかまいせん。
※ += で前の変数に足しています。


問題7
例7を参考にして、
血液型・年齢・生年月日・学年・学籍番号・ゼミが表示できるようにしなさい。
ただし血液型・年齢・生年月日はMy_Dataクラスにいれて
学年・学籍番号・ゼミはOtani_studentにいれなさい。
下の図は解答例です。

