Python クラス #2
株式会社リュディアです。今回も引き続きクラスについてまとめていきます。
前回までの Python クラスについてのまとめへのリンクは以下を参考にしてください。
今回はクラス変数とインスタンス変数についてまとめてみます。例として野菜をオブジェクトとするクラスを作ってみます。野菜は世界中に 800 種類あるものとします。またそれぞれの野菜は何らかの色をもっています。でも色は野菜ごとに違います。これらの性質を元にクラスを設計してみましょう。
まず野菜全体にあてはまる性質を野菜クラスが持つクラス変数とします。野菜が世界中に 800 種類あるという事実は野菜ごとに変わるものではないですよね?野菜を表現するクラス VegetableClass が本質的に持つ性質というか事実なわけです。そこで以下のように記述します。
class VegetableClass():
num_of_types = 800
print(VegetableClass.num_of_types)
# 800
クラス VegetableClass から num_of_types にアクセスして 800 という数が表示されました。
次にクラス変数の値を途中で変更してみます。以下の例を見てください。
class VegetableClass():
num_of_types = 800
print(VegetableClass.num_of_types)
VegetableClass.num_of_types = 1000
print(VegetableClass.num_of_types)
# 800
#
# 1000
クラス変数 num_of_types を 1000 に変更した後に表示すると 1000 になっていることが確認できますね。クラス変数へのアクセスはクラス名 VegetableClass からアクセスしていることに注意してください。
クラス変数を扱っていると当然次のような疑問が湧くと思います。クラスに固有の値はクラス変数を使えば問題ないがインスタンスによって値が変わる場合はどうすればよいのか?ここでインスタンス変数の出番です。インスタンス固有の情報を扱うために利用する変数なのでインスタンス変数と呼びます。例えば野菜の色はどうでしょうか?野菜全体で決まった色はなくて、野菜ごとに異なりますよね。VegetableClass を以下のように書き換えてみます。
class VegetableClass():
num_of_types = 800
def __init__(self, c):
self.color = c
lettuce = VegetableClass('green')
tomato = VegetableClass('red')
print(lettuce.color)
print(tomato.color)
# green
# red
新しい記述が出てきました。def __init__(self, c): です。コンストラクタと呼ばれます。クラスをインスタンス化したときに一度だけ自動で呼び出される関数です。今回の VegetableClass であればインスタンス化する際に引数として野菜の色を文字列で渡すことでクラス内のインスタンス変数 color に渡された色が設定されます。インスタンス変数には self.color のように self. を付ける必要がありますので注意してください。self について、現段階ではインスタンス変数やインスタンスメソッドを定義する際に必要なキーワードと考えておいてください。
この例の実行結果を見ると lettuce.color は green, tomato.color は red になっていることがわかりますね。Python ではインスタンス変数はコンストラクタの中で定義しましょう。インスタンス固有の情報であるということはインスタンス化した際に決まるという考え方を徹底するためです。
Python のクラスに関するまとめの続きは以下からどうぞ。
では、ごきげんよう。