クラス

はじめに

C ではデータ構造は配列と struct があります。 Python では、list や dict(ionary) があるので、struct がなくても、比較的簡単に複雑な構造を扱えるようになりました。 ただ、各用途にあわせたデータ構造や関数を準備したいとき、「変な(意図しない?)形も許してしまう」dict などでは困ることもあります。

以下では、Java などのプログラミング言語と連想させる形で簡単な説明をおこないます。

クラスの変数と関数

オブジェクト指向言語では、field, method と呼ばれるものですね。

class Person:  # Person クラスをつくってみた
    _birth_year: int
    _name: str

    def to_str(self):  # このオブジェクトの str 表現を作成してみる。
        return f"My name is {self._name}. I was born in {self._birth_year}."

クラスはデータ構造を定義し、そのインスタンスが持つ変数(ここでは _bitrh_year, _name)や関数(to_str())を定義しています。

Java とは異なり、関数は、第一引数に自身のインスタンスを示す self を引数に取ります。 インスタンスobj の変数 _name にアクセスする場合は、obj._name になるし、関数 to_str() の呼び出しは、obj.to_str() のようになります。

継承

Person を拡張して、Person の特化版を作りたいときは「継承」をおこないます。 今回は、Person の一種である Student を作成しています。

class Student(Person):  # Person を拡張した Student クラスをつくってみた
    _student_id: str

    def to_str(self):  # Student 用の str 表現を作成してみる。
        # 冒頭は、 super() つまり親クラスの to_str() 入れてみた
        return f"{super().to_str()} My id is {self._student_id}."

フィールドとして id を追加し、あと関数(to_str())の中身を変更してみました。ちなみに、 Java の toString() 相当は、__str__(self) 関数です。ってことで、各クラスの __str__(self) を返れば、str(obj) の振る舞いを変更することができます。

クラス階層の詳しい話は、「オブジェクト指向プログラミング」などの授業を受講してください。

Read more