Pythonのクラスとインスタンス~selfとは?~
クラスとはデータと処理をまとめたものです。
データ→アトリビュート
処理→メソッド
と呼ばれます。
クラスにアトリビュートを作ることを「アトリビュートを定義するといいます。
アトリビュートと変数のちがいは、クラスの外にあるかどうかです。
メソッドを定義する場合、必ず1つ引数を記述しなければならないです。渡したい引数がない場合でも、必ず引数が一つ必要になります。
この引数は、どんな引数名でもよいのですが、selfと書かれていることが多いです。
メソッドに渡したい引数が1つの場合、メソッドの引数にselfと渡したい引数名の合計2つ。
メソッドに渡したい引数が2つの場合、メソッドの引数にselfを含めた合計3つの引数を記述します。
このselfの役割は、Pythonがプログラムの実行で使っているものです。
理屈が少し複雑なので、メソッドの引数にはどんな場合もselfと書くと覚えてしまいましょう。
[クラスの例]クラス名をStudentとします(クラス名の最初の文字は大文字にしましょう)
そのクラスに生徒の名前を代入する「name」というアトリビュートを定義します。そして、数学と英語の点数を計算するavgというメソッドを定義します。
メソッドの定義方法は、関数と同じく
def
で定義します。
クラスは、クラスから作られたインスタンスを変数に代入してから使います。クラスはインスタンスになって初めて使えるようになります。
クラスを使えるような状態にすることを「インスタンス化」「オブジェクト化」と言ったりします。
つまり、インスタンス化とは、クラスという型から、インスタンスという実際につかえるものを作ることをいいます。
インスタンス化は、
となります。(例で言うと、a001=Student())
メソッドの実行方法は、
です。(例で言うと、a001.avg())
class Student:
def avg(self):
print((80+70)/2)
a001=Student()
a001.avg()
実行結果は75.0
ここまでは、点数を直接メソッドの中に記述しました。これだと生徒が変わるごとにメソッドの書き換えが必要です。これを引数で渡して計算できるようにしましょう。そうすることでクラスを使いまわせるようになります。アトリビュート(例の場合、a001.nameとします)にも値を代入できます。
class Student:
def avg(self,math,english):
print((math+english)/2)
a001=Student()
a001.avg(80,70)
a001.name="sato"
print(a001.name)
実行結果
75.0
sato
新しいインスタンスを作るごとに、アトリビュートを定義する必要があります。その不便さを解消するのが、コンストラクタです。コンストラクタは、インスタンス化するときに、自動的に実行されるメソッドです。コンストラクタは、初期化メソッドともいいます。コンストラクタでインスタンス変数を初期化する構文は、
self.インスタンス変数=引数
となります。
class Student:
def__init__(self):
self.name=""
def avg(self,math,english):
print((math+english)/2)
a001=Student()
a001.name="sato"
print(a001.name)
a002=Student()
a002.name="tanaka"
print(a002.name)
実行結果
sato
tanaka
アトリビュートは、インスタンス化と同時に代入することもできます。
class Student:
def__init__(self,name):
self.name="name"
def avg(self,math,english):
print((math+english)/2)
a001=Student("sato")
print(a001.name)
a002=Student("tanaka)
print(a002.name)
実行結果
sato
tanaka
まとめ
クラスは一度定義しておけば、後からいくらでもインスタンスをつくることができます。車を作る設計図がクラスです。もう一つ例えると、クラスは、パソコンで使うコピー&ペーストです。
もしクラスがなければ、生徒ひとりひとりのためにStudentクラスを書かなければいけないので面倒です。クラスがあるから効率よくコードを書くことができます。
class Student: ←クラス
def__init__(self,name): ←コンストラクタ
self.name=”name” ←アトリビュート
def avg(self,math,english): ←メソッド
print((math+english)/2)
a001=Student(“sato”) ←インスタンス
print(a001.name)