◆ スクリプト例
class SchoolReport:
def __init__(self, name, score):
self.student_name = name
self.student_score = score
# メソッド(インスタンスメソッド)の例
def show(self):
return f'{self.student_name}: {self.student_score}点'
# イニシャライザの引数(name, score)に入れたい値を指定(self の次の引数)
sr_a = SchoolReport('田中 A', 85)
sr_b = SchoolReport('鈴木 B', 92)
# 表示する
print(sr_a.show())
print(sr_b.show())
実行結果
田中 A: 85点
鈴木 B: 92点
◆ クラス
「クラス」とは「設計図(またはテンプレート)」である。
class SchoolReport:
def __init__(self, name, score):
self.student_name = name
self.student_score = score
このコード自体はまだ何も処理を行わない。「成績表とはこういうデータを持つものだ」という定義(仕様書)があるだけ。
◆ インスタンス
実際にメモリ上で作成された「実体」のこと。
今回の例では "SchoolReport型の個体(インスタンス)" である。
例:名前「田中 A」、点数「85点」を持つ成績表データ
PythonのOOPの文脈では、「インスタンス」と「オブジェクト」は基本的に同義。
◆ インスタンス変数
→ オブジェクトごとに違うデータが代入される変数
上記の例では student_name と student_score がインスタンス変数にあたる。
◆ メソッド
→ クラスの中で定義された「処理(関数)」 のこと。
そのクラスから作られたインスタンス(オブジェクト)に対して呼び出して使う。
例:
def show(self):
return f'{self.student_name}: {self.student_score}点'
これは「インスタンスメソッド」で、そのインスタンスが持つデータ(インスタンス変数)を使って処理するのが基本。
呼び出しは次のようになる:
sr_a.show()sr_b.show()
このとき show の先頭引数 self には、それぞれ呼び出し元のインスタンスが自動で入る(sr_a から呼べば self = sr_a)。
◆ self
→ このクラスからオブジェクトが作成されたとき、そのオブジェクト自身を表す。
なぜ self が必要かというと、Pythonのクラス定義の中では「これから作られる個体の具体的な名前(変数名)」がまだ分からないからである。
そのため、メソッド内で「生成されたその個体自身」を指し示す共通の入口として self を使う。
また、sr_a.メソッド(...) のように「インスタンスから」メソッドを呼び出すと、Pythonが内部的にそのインスタンスを先頭引数(self)として自動で渡す。たとえば次はほぼ同じ意味になる。
sr_a.show()- (内部的なイメージ)
SchoolReport.show(sr_a)
同様に、次もほぼ同じ意味:
sr_a = SchoolReport('田中 A', 85)- (内部的なイメージ)
SchoolReport.__init__(sr_a, '田中 A', 85)
◆ init
→ イニシャライザ(初期化メソッド)。
通常、クラスからインスタンスが生成されるときに 1回呼び出される(自動実行される)。
インスタンス変数に値を代入するときによく使われる。
※厳密には、オブジェクト生成そのものは主に __new__ が担当し、__init__ は生成後の初期化を行う。
init を使うメリット:
→ インスタンスを "正しく初期化し、完全な状態" で使えるようにすること。
さらに、
「インスタンス(その個体)に紐づく値」として保持したい場合は、self.xxx の形で代入する。
例:self.student_name = name / self.student_score = score