はじめに
よく聞く「クラス」ですがPythonでクラスを定義することでコードの可読性が向上し、保守性が高まります。
どういう時に定義するのか、そもそもクラスとはどのようなものなのかを一から説明していきたいと思います。
これからPythonを利用して仕事をする方や、現時点でPythonを利用している方の振り返り材料として活用いただければと思います。
\自身のスキルを向上するには技術書で!!/
月額¥980で技術書が読み放題!!
- ビジネススキルとマインド向上したい!!
- 決断や行動を先送りにしてしまう方!!
クラスについて
そもそもクラスを説明する前にオブジェクトという言葉から理解する必要があります。
「オブジェクト」とは簡単に直訳すると「もの」という表現になります。
プログラミングにおける「オブジェクト」とは、データと処理の集まりをさしており、あいまいに表現される用語です。
このオブジェクトの内容を記述しておく仕組みのことを「クラス」と言います。「テンプレート」や「雛形」と表すとわかりやすいかと思います。
クラスの定義
Pythonでのクラスは下記のような構文で記載します。
class MyClassName:
def __init__(self, 引数2,・・・)
pass
クラス内では、基本的に「コンストラクタ」と呼ばれるオブジェクト生成時に最初に実行される関数を定義します。このコンストラクタは「init()」という名前で定義するのがルールとなります。
関数(メソッド)
クラス内では様々な処理を記載します。その処理の仕方を書く部分を「関数(メソッド)」と呼びます。
たとえば、以下のような処理を例に挙げます。
class MyClassName:
def sum(a, b):
return a + b
MyClassNameというクラスにsumというメソッドを用意しました。メソッドを作る場合は「def」というキーワードを利用して定義します。
上記では引数にaとbを渡しており、sumメソッドはその合計を返すメソッドとなります。
様々なクラスの定義
様々なサイトでクラスについて細かく説明されていると思いますが、本投稿では様々なクラスの定義の仕方を紹介していきます。
一般的なクラスの定義
selfとは自身を示すものであり、多くのクラスで利用されます。
class MyClass:
def __init__ (self, a, b):
self.a = a
self.b = b
def write(self):
print(f"aの値:{self.a}、bの値:{self.b}")
このクラスは「a」と「b」の2つのデータを持つ「MyClass」となります。ここでは、writeメソッドを用意し、コンソールにメッセージを表示します。
ではどうやって呼び出すかというと、下記のように呼び出します。
init コンストラクタはクラスを呼び出した際に呼ばれ、MyClassのaに3が代入され、bに10が代入されます。
その後、writeメソッドを呼び出すことで、aとbに代入した値を出力しています。
my_obj = MyClass(3, 10)
my_obj.write()
# aの値:3、bの値:10
補足ですが、selfは暗黙の了解として第1引数に指定するのが一般的です。
指定しなくても良いですが、基本的に指定するのが良いと思います。
@classmethodの利用
Pythonにはクラスメソッドという機能があります。基本的にクラスに定義したメソッドを呼び出す際は、まず下記のようにインスタンス化してメソッドを呼び出します。
my_obj = MyClass(3, 10)
my_obj.write()
Pythonでは「@classmethod」をメソッドにつけることで、クラスから直接呼び出すことができます。
class MyClass:
@classmethod
def write(cls):
print("classmethodによる呼び出し")
MyClass.write()
# classmethodによる呼び出し
メソッドには「cls」という引数をつけています。こちらもselfと同じように第1引数に指定する必要があります。
クラス内に定義する変数
クラス内に定義した変数を「クラス変数」と呼びます。クラスの個々のインスタンスではなくクラスそのもに属している変数であり、利用用途しては、対象クラスに共通する情報を利用する場合に定義します。
class MyClass:
num_val = 0
def __init__ (self, a, b):
self.a = a
self.b = b
MyClass.num_val += a + b
def write(self):
print(f"{MyClass.num_val}")
my_obj = MyClass(3, 10)
my_obj.write() # 13
上記の「num_val」がクラス変数となります。
このクラス変数にアクセスする場合は、クラス名.変数名 のように記載します。
下記のように直接変数にアクセスすることもできます。
my_obj = MyClass(3, 10)
print(my_obj.num_val) # 13
pythonではクラス変数を必ずと入っていいほど使いますので、使い方を覚えておいた方が良いかと思います。
クラスの継承
クラスの継承は、クラスの処理を覚える上で一つの壁となるかと思います。
継承とは、既存のクラスから派生して新しいクラスを作成する仕組みとなります。
継承されたクラスを「サブクラス(派生クラス)」と呼び、継承元のクラスは「スーパークラス(基底クラス、親クラス)」と呼びます。
このサブクラスは、ベースクラスのすべてのプロパティと動作を継承します。
サブクラスの定義方法は下記のようにクラスのキーワードとベースクラスの名前をコロン「:」で区切って使用します。
class MyClass:
num_val = 0
def __init__ (self, a, b):
self.a = a
self.b = b
MyClass.num_val += a + b
def write(self):
print(f"{MyClass.num_val}")
class SubClass(MyClass):
def hoge(self):
print (f"a: {self.a}")
my_obj = SubClass(3, 10)
my_obj.hoge() # a: 3
上記の結果を見ると、MyClassというベースクラスに所属する「a」という変数を継承先のサブクラスで利用することができ、ベースクラス側のコンストラクタにて、「a」という変数に「3」という値が設定されているのが分かります。
オーバーライド
オーバーライドは、親クラスのメソッドを「上書き」する手法のことを言います。
オーバーラードする場合は、親クラスに設定したメソッドを、サブクラスに対して同じメソッド名で定義します。
class MyClass:
num_val = 0
def __init__ (self, a, b):
self.a = a
self.b = b
MyClass.num_val += a + b
def write(self):
print(f"{MyClass.num_val}")
class SubClass(MyClass):
def write(self):
print (f"{SubClass.num_val}")
my_obj1 = MyClass(3, 10)
my_obj1.write() # 13
my_obj2 = SubClass(4, 20)
my_obj2.write() # 37
上記を見てみるとわかるように「write」メソッドをサブクラスにてオーバーライドしています。「num_val」という親クラスに定義したクラス変数に対して上書きされています。
my_obj1では 「a + b = 13」という値が「num_val」に代入されます。
その後 my_obj2 では サブクラスを呼び出し「a + b = 24」の結果を元々のnum_valの値にプラスしています( += の計算式なので)
最後に
今回はPythonのクラスについてまとめました。基本的なクラスを作成する場合は本稿で記載した内容を覚えておくだけで事足りるかと思います。
継承やオーバーライドといった手法は初めての方は理解に時間がかかるかもしれませんが、利用できるようになると、今後の開発がとても有意義となり、その後の保守性も高まるのでぜひ覚えておいてほしいと思います。