プログラミングを行う上で、可視性が高く、理解しやすいことは、重要な要素の一つかと思います。
これにより、結果的に障害を組み込んでしまう機会も軽減できるかもしれません。
それを可能にする方法の1つとして考えられるのが「オブジェクト指向(詳細は、こちら)」です。
今回は、そんなオブジェクト指向をpythonで実装する方法のうち、「クラスの実装と利用」について、まとめます。
前提知識
本記事で使用する重要な用語を簡単にまとめておきます。詳細を知りたい場合は、こちらを参考にしてください。
クラス
クラスとは、定義された要素をまとめた「ひな形」です。特定のグループの共通事項の集まりとも言えるでしょう。
どんな特徴(フィールド)があって、何をするもの(メソッド)なのか?を定義していきます。
例えば、「人」「遊具」「果物」というようなイメージです。
インスタンス化
ひな形である「クラス」に具体的な値を設定し、「オブジェクト」にすることです。
オブジェクト
クラスを基に作られた、具体的な値を持った「モノ」「実体」です。
クラスが「果物」であれば、オブジェクトは「リンゴ」「バナナ」といった1つ1つになります。
クラスの使い方(基本)
ここからは、Pythonで実際にクラスを使うときに必要な知識を記載します。
クラスの定義
まずはクラスの定義の仕方です。
宣言方法は「class 任意のクラス名():」です。実際の処理は、インデントを下げて記載していきます。
コードサンプル:
class SampleClass():
pass
なお、継承(別文書で記載します)をしないクラスの場合は、以下のように()がなくても問題はありません。
コードサンプル:
class SampleClass:
pass
クラスの利用(インスタンス化)
次は、クラスを利用する方法です。
基本的には、変数にクラスを代入するように記載します。
この時、代入するクラスには、必ず「()」を付ける必要があります。この()により、クラスから作られたオブジェクトとして見なされます。
コードサンプル:
class SampleClass:
pass
sampleInstance = SampleClass()
クラスの使い方(メソッドの実装と利用)
ここからは、クラスの作りこみについて記載していきます。
「引数なし」の場合
メソッドは、クラスの宣言の中で「関数」を使用して記載します。
また、Pythonの場合は特殊で、メソッドを利用する際に、宣言するクラスから作られた(インスタンス化された)オブジェクト自身を表す「self」を第一引数として記載する必要があります。
self を設定することで、1つのクラスから作られた複数のオブジェクトを別々のモノとして、扱えるようになります。
実行する場合は、オブジェクトを変数に代入し、「変数.メソッド名」と記載します。
コードサンプル:
class SampleClass:
def show(self):
print(‘showメソッドが実行されました。’)
sampleInstance = SampleClass()
sampleInstance.show()
実行結果:
showメソッドが実行されました。
仮に、show(self) の「self」を書かなかった場合は、「TypeError: SampleClass.show() takes 0 positional arguments but 1 was given」となります。
これは、「引数は取らない(0個)のはずなのに、1個与えられている」ということになります。この1つは、オブジェクト自身が引数として渡されているために起こるエラーです。
「引数あり」の場合
引数ありの場合は、メソッドの「self」の後に続けて記載するようになります。
利用時は、メソッドを記載する際に引数を与えます。この時の引数は、クラス内で定義したメソッドの第二引数以降を記載してください。
コードサンプル:
class SampleClass:
def show(self, name, age):
print(f'{name}さんは、{age}歳です。’)
sampleInstance = SampleClass()
sampleInstance.show(‘お試しユーザー’,30)
実行結果:
お試しユーザーさんは、30歳です。
「戻り値あり」の場合
メソッドでは、return文により、戻り値を設定することもできます。
コードサンプル:
class SampleClass:
def plus_cal(self, num_A, num_B):
ans = num_A + num_B
return anssampleInstance = SampleClass()
ans_plus = sampleInstance.plus_cal(1,2)
print(ans_plus)
実行結果:
3
クラスの使い方(フィールド)
ここでは、変数の設定について、説明します。
インスタンス変数
インスタンス化されたオブジェクト毎に値を格納する変数になります。
なお、実際にインスタンス変数を呼び出す際は、オブジェクト自身が持つ変数を意味するように「self.」を付ける必要があります。
「self.」を付けないと、引数から持ってきている値と認識されてしまいます。
コードサンプル:
class SampleClass:
name = None
def show(self):print(self.name)
name1 = SampleClass()
name2 = SampleClass()
name1.name = “ユーザー1”
name2.name = “ユーザー2”
name1.show()
name2.show()
実行結果:
ユーザー1
ユーザー2
クラスの使い方(特殊メソッドの実装と利用)
ここからは、特殊なクラスの作りこみについて記載していきます。
コンストラクタ
インスタンス化された時に、必ず実行されるメソッドです。
メソッドの基本形は、「def __init__(self):」となります。
よくある用途として、インスタンス変数を初期化する処理を記載したりします。
先述のインスタンス変数をコンストラクタを用いて記載すると、以下のようになります。なお、実行結果は同じものです。
コードサンプル:
class SampleClass:
def __init__(self, name):
self.name = name
def show(self):
print(self.name)
name1 = SampleClass(“ユーザー1”)
name2 = SampleClass(“ユーザー2”)
name1.show()
name2.show()
デストラクタ
インスタンス化されたオブジェクトが削除された時に、必ず実行されるメソッドです。
メソッドの基本形は、「def __del__(self):」となります。
コンストラクタの例に、デストラクタを追加してみます。
コードサンプル:
class SampleClass:
def __init__(self, name):
self.name = name
def show(self):
print(self.name)
def __del__(self):
print(f'{self.name}の処理終了’)
name1 = SampleClass(“ユーザー1”)
name2 = SampleClass(“ユーザー2”)
name1.show()
name2.show()
実行結果:
ユーザー1
ユーザー2
ユーザー1の処理終了
ユーザー2の処理終了
まとめ
今回は、pythonにおけるクラスの実装と利用方法についてまとめてみました。
大規模なソースコードになるほど重要な内容になってくると思います。
ぜひ、参考にしてみて下さい。