PythonのClass
クラス(class)とは
クラスとはオブジェクトの設計図のようなものです。
コード上はデータや処理をまとめておくことができます。
Pythonのクラスのコードは例えば以下のようなものです。selfやinitはクラスを使う際の専門用語のようなものなので今は意味がわからなくても構いません。
class Animal:
def __init__(self,name,voice):
self.name = name
self.voice = voice
def say(self):
print(f'{self.name}が{self.voice}と鳴きました')
このクラスは動物クラスで、初期化時に動物の名前と鳴き声を受け取ります。
呼び出す時には以下のように使うことができます。
dog = Animal('犬','ワン!')
cat = Animal('猫','にゃー')
# 「犬がワン!と鳴きました」と出力される
dog.say()
# 「猫がにゃーと鳴きました」と出力される
cat.say()
クラスオブジェクトを利用している間、設定した情報は保持され続けます。
クラスはオブジェクト指向という考え方の根本的な要素でもあります。
クラスの使い方
クラスを扱ったコードを作成するためには以下のことを行う必要があります。
・クラスの宣言(設計図の宣言)
・クラスのインスタンス化(実体化)
クラスの宣言
クラスは以下のように記述することで定義することができます。
class Animal:
# 処理を書く
クラスのインスタンス化
Pythonでは命令文を記述すれば先頭から実行されますが、クラスをコードから利用するためにはインスタンス化(実体化)する命令文を書く必要があります。
インスタンス化とはクラスという設計図から実際のオブジェクトを生成する作業のことを表しています。
# Animalクラスのインスタンスを生成
dog = Animal()
dog.say()
最低限これだけでクラスを利用することができます。
クラスのプロパティを定義する
クラスはプロパティ・・・変数を持つことができます。
この変数はクラスがインスタンス化されている間、ずっと保持されます。
プロパティはinit関数の中で宣言することで定義することができます。
init関数はクラスのインスタンスが生成された時に必ず呼ばれる関数です。
プロパティの宣言の他、インスタンス生成時に必ず行って欲しい処理を記述することもできます。
class Dog:
def __init__(self,name):
self.diffrent = '犬'
self.voice = 'ワン!'
# インスタンス生成時に渡してもらう値
self.name = name
self.spped = 0;
init関数の引数にselfとnameがあります。
self
selfはそのクラス自身を意味する引数で、クラス内のコード上でそのクラス自身のプロパティやメソッドを利用して処理を行いたい場合にはselfを引数に含む必要があります。
サンプルコードの場合はクラス自身のプロパティを定義するためにselfを引数に加えています。
インスタンス引数
もう一つのnameはインスタンス時に渡して欲しい値を表しています。サンプルコードのように宣言した場合、インスタンス時のコードは以下になります。
selfはインスタンス生成時に渡す必要はありません。
dog = Dog('ポチ')
クラスのメソッドを定義する
クラスにはメソッドを定義することができます。先の例で言うところのsay関数がクラスのメソッドです。
クラス内のメソッドはインデントを下げる以外は通常のメソッドの宣言と同じです。
class Dog:
def say():
print('犬がワン!と鳴きました')
クラスのメリット
コードを再利用しやすくなる
クラスを利用することでコードを再利用しやすくなります。例えば、たくさんの犬が必要な時に犬ごとに処理を一つ一つ書くのは大変です。しかし、クラスを使えば、一つクラスを定義するだけで犬についての処理を書くだけで済みます。
class Dog:
def __init__(self,name):
self.name = name
def bark():
print(f'{self.name}がワン!と鳴きました')
poti = Dog('ポチ')
taro = Dog('太郎')
# ポチがワン!と鳴きました
poti.bark()
# 太郎がワン!と鳴きました
taro.bark()
関連するプロパティやメソッドを管理しやすくなる
クラスを定義することで関連するプロパティやメソッドを管理しやすくなります。
以下は犬と猫の名前と鳴き声を出力するコードをクラスを用いなかった場合とクラスを用いた場合のコードです。
クラスを用いない場合
def bark(name,voice):
print(f'{name}は{voice}と鳴きました')
def meows(name,voice):
print(f'{name}は{voice}と鳴きました')
dog_name_poti = 'ポチ'
dog_voice_poti = 'ワン!'
dog_name_taro = '太郎'
dog_voice_taro = 'ヴォン!'
cat_name_tama = 'たま'
cat_voice_tama = 'みゃー'
bark(dog_name_poti)
bark(dog_name_taro)
meows(cat_name_tama)
クラスを用いた場合
class Dog:
def __init__(self,name,voice):
self.name = name
self.voice = voice
def bark(self):
print(f'{self.name}はワン!と鳴きました')
class Cat:
def __init__(self,name,voice):
self.name = name
self.voice = voice
def meows(self):
print(f'{self.name}はにゃーと鳴きました')
dog_poti = Dog('ポチ','ワン!')
dog_taro = Dog('太郎','ヴォン!')
cat_tama = Cat('たま','みゃー')
dog_poti.bark()
dog_taro.bark()
cat_tama.meows()
クラスを用いなかった場合は、犬の名前と鳴き声を一つの処理上で管理しなければならなかったのに対して、クラスを用いた場合は名前と鳴き声はインスタンス化したときにまとめて管理することができています。
また、barkとmeowsはそれぞれの動物の鳴き声に対応したメソッドです。それを犬クラスと猫クラスそれぞれで宣言することでより管理しやすくなっているように感じます。
プログラムをきれいに書くことができる
関連するプロパティやメソッドを管理しやすくなるで書いた通り、プログラム上で必要な情報を管理しやすくなったことでよりシンプルに処理を記述することができます。
シンプルに書くことができれば、コードを綺麗に保つこともより容易になります。
まとめ
クラスを利用することでコードをより管理しやすく作ることができます。
管理しやすくなったことによって、より美しいコードを書くことができるようになります。
私も厳密に理解できている自信がないため説明しませんでしたが、クラスをより正しく使うための概念として、オブジェクト指向という考え方があります。
なんとなく知っているだけでも効果的であるため、もっと良いコードを書きたいと思ったらオブジェクト指向について調べてみてください。私もいずれ、私なりの理解でのオブジェクト指向をまとめようと思ってはいます。