Python/クラス

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

クラスとオブジェクト[編集]

「クラス」とは何かというと、たとえば「山田くんちの車」も「伊藤くんちの車」も、ともに「車」というクラスに含まれます。このように、あるモノをまとめて含むものが、クラスです。

私たちの社会では「車」というものはメーカーや車種という属性があって、「ドアを開ければ乗りこむことができる」とか「アクセルを踏めば発進できる」というような操作を持つものだとおよそ決まっています。この決まりのおかげで、「車を運転する方法」を知っている人なら「山田くんちの車の運転方法」や「伊藤くんちの車の運転方法」を個別に覚えることなくどちらでも運転することができるのです。これがクラスを用いるメリットです。もし「車」というクラスがなければ、ちがう車を運転するたびにその車の運転方法を勉強しなければいけません。

いっぽうクラスに含まれている具体的なものは、「インスタンス」といいます。さきほどの「車」の例なら、「山田くんちの車」はインスタンスですし、「伊藤くんちの車」もインスタンスです。オブジェクトは属性や操作などクラスで決められているものをすべて持ちます。

このように、ひとつのクラスに含まれるインスタンスは、複数個あっても、かまいません。交差点で車を整理する警察官は「交通整理」というプログラムの中で車というクラスに属する複数のインスタンスを操作しています。

クラスの定義[編集]

pythonでのクラスをつくるための基本的な構文は、

class クラス名:
    そのクラスの内容

です。ループや条件分岐でしたように、インデントすることを、忘れないでください。

とりあえず、

class kuruma:
    pass

というコードをつくりましょう。

passとは、「何もしない」という内容のキーワードです。これからクラスをつくる作業をするときなどに、とりあえずの記述として、「pass」がよく、用いられます。

実際のところは、クラスの定義では、

class クラス名:
    def __init__(self, 変数名1、変数名2):
        self.変数名1 = 変数名1
        self.変数名2 = 変数名2

というふうに、コードを書きます。

さて、「__init__()」とはクラス定義のための特別な関数であり、そのクラスを初めてつくるときの動作を記述します。また、「__init__()」の一番目の変数「self」も、特別な変数ですので、この「self」の語句のまま、入力してください。

なお、記号「_」(アンダーバー)を2つ書いて、「__」になります。「init」の前にアンダーバーが2つあります。同様に、「init」のうしろにもアンダーバーが2つあります。

では、クラス名が「kuruma」としましょう。車の色を、1番目の変数として、変数名を「iro」としましょう。車のナンバーの番号を、2番目の変数として、変数名を「bangou」としましょう。

すると、クラスの構造の定義は、下記コードのようになります。

class kuruma:
    def __init__(self, iro, bangou):
        self.iro = iro
        self.bangou = bangou


self.iro = iroのように、「self.iro」に、まだ値の決まってない「iro」を代入していますが、しかしクラスの定義では特別であり、このように記述しても、エラーには、なりません。

インスタンスの定義と変数[編集]

さて、もし、山田くんちの車(変数名は「yamadacar」としよう)が、青くて("blue"と記述することにしよう)、ナンバープレート番号が「1234」だとしたら、 下記コードのように、yamadacar = kuruma("blue", 1234)と記述します。

オブジェクトの持つ変数を参照するときは、yamadacar.iroのようにピリオドを使います。このようにクラスで定義されてオブジェクトがそれぞれの値を持つ変数をインスタンス変数と言います。

class kuruma:
    def __init__(self, iro, bangou):
        self.iro = iro
        self.bangou = bangou

yamadacar = kuruma("blue", 1234)
itoucar = kuruma("red", 3355)

print(yamadacar.iro)

上記コードを実行すると、

blue

と表示されます。

さて、車はたいてい車輪が4つついています。これは山田くんちの車でも伊藤くんちの車でも、車である限り変わりません。このようにインスタンスに共通でクラスとしての性質を持つ変数をクラス変数と言います。

クラス変数を定義するには、クラスのすぐ下に書きます。

class kuruma:
    wheel_num = 4
    def __init__(self, iro, bangou):
        self.iro = iro
        self.bangou = bangou

yamadacar = kuruma("blue", 1234)
itoucar = kuruma("red", 3355)

print(yamadacar.iro)

クラス変数を参照するときも、インスタンス変数と同様にピリオドでつなげて表します。

メソッド[編集]

クラスにはインスタンスの持つ属性だけでなく、それに対する共通の操作も定義することができます。その操作のことをメソッドと言います。

メソッドを定義するには、関数を定義したようにクラスの中にdefで定義します。ただし通常の関数の定義とちがい第一変数を必ずselfとします。

たとえば、車は塗装して色を変えることもできます。色を変えるメソッドをchange_iroとして、変更後の色をnew_iroという引数として持つとしましょう。これを実装すると以下のようになります。

class kuruma:
    wheel_num = 4
    def __init__(self, iro, bangou):
        self.iro = iro
        self.bangou = bangou

    def change_color(self, new_iro):
        self.iro = new_iro

ここで少し立ち止まってこのコードを考えてみましょう。実は、最初に説明した「__init__」もメソッドも一種です。そのクラスが具体化したインスタンスが呼び出されたときに、自動的にそのインスタンスに対して行われる操作を表しています。

selfという変数ですが、これはインスタンスそのものを表します。つまりインスタンスとして呼び出されたとき、yamadacarやitoucarというものが入るものです。yamadacar = kuruma("blue",1234)という文が実行されたとき、__init__が実行されますが、そのときselfにyamadacarが入って、

yamadacar.iro = "blue"
yamadacar.bangou = 1234

という処理が実行されるのです。

さて一般のメソッドの話に戻りましょう。メソッドを呼び出すときもインスタンス変数を参照するときと同様にyamadacar.change_iro()のように呼び出します。山田くんちの車を黄色に塗り替えるコードを考えると、次のようになります。

class kuruma:
    wheel_num = 4
    def __init__(self, iro, bangou):
        self.iro = iro
        self.bangou = bangou

    def change_color(self, new_iro):
        self.iro = new_iro

yamadacar = kuruma("blue",1234)
yamadacar.changecolor("yellow")

まとめ[編集]

ここまでクラスとは何かとそれを使う方法について書いてきました。ここまでに紹介したコードはすべて単独で動作するように書いているという事情もありますが、実はわざと冗長に書いています。

初級編で私たちはモジュールについて学びました。クラスはモジュールと組み合わせることで非常に強い力を発揮します。その使い方についてはこの先で述べていきます。