クラス
はじめに
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)
の振る舞いを変更することができます。
クラス階層の詳しい話は、「オブジェクト指向プログラミング」などの授業を受講してください。