オブジェクト指向に必要不可欠なクラス。Pythonでもこのクラスを使う事ができます。
でも、クラスって訳分からん!という声も出てきそうですし、実際の所、クラスを使えなくとも全然Pythonのプログラムは書けてしまいます。
ただ、分業でコードを書く場合にはクラスが大活躍しますし、他の人が書いたコードにクラスが含まれていた場合、意味を理解できないと大変です。
覚えてしまえば非常に便利なPythonのクラスの使い方についてご紹介します。
クラスとは?
プログラミングする上で今や必須になったオブジェクト指向。
※といいつつ、ちゃんと使っていないプロジェクトがすごく多いのが実状。。。
オブジェクト指向には「継承」、「カプセル化」、「ポルモーフィズム」という考え方があります。この中の「カプセル化」や「継承」をクラス(コード上はclass)によって実現しています。
特に、カプセル化は様々な定義で理解される事が多いと実感していますが、「プログラムの振る舞いを抽象化する・変更を最小限に留める」といった事がメリットなのだと理解しています。
オブジェクト指向の話になると、少し抽象的な話に終始してしまうので、ここでは細かい話は語りません。それでも、コードの記述方法や使い方を理解していると非常に便利だという事は分かるはずです。それはPythonでも例外ではありません。
Pythonのクラスの使い方
さっそく、クラスの書き方をご紹介します。Pythonでクラスを書くときは以下の様な記載方法になります。
1 2 3 4 5 6 7 |
class クラス名: def __init__(self,): #処理を記載 def メソッド名(): #処理を記載 |
クラス名の指定は関数と同じ様に「class クラス名:」とすればOKです。
※ちなみにクラス名は大文字で記述するのが一般的です。
クラスを使ったコード
クラスを実際に使う場合にはオブジェクトを生成して使用します。
以下のルールを知っておけばクラスを使うのは簡単です。
※きっと既に以下の記述はした事があるはずです。
オブジェクトの生成:オブジェクト名=クラス名()
メソッドの呼び出し:オブジェクト名.メソッド名()
※オブジェクトはインスタンスとも言われます。厳密には違うのですが一旦同じ様なものと覚えておいてOKです。
実際にクラスからオブジェクトを生成する流れを見てみましょう。
■Pythonコード(一般的なルール通りクラス名の先頭は大文字にしています。)
1 2 3 4 5 6 7 8 9 10 |
class TestClass: def __init__(self): self.val0 = 1 def sum(self,val1,val2): sum = self.val0 + val1 + val2 print(sum) test_instance = TestClass() test_instance.sum(2,3) |
■実行結果
1 |
6 |
細かい部分はこれから解説しますので、まずはクラスからオブジェクトを生成して、メソッドを呼び出す流れを押さえておきましょう。
コンストラクタ
関数の様に定義された「def __init__~」の部分をコンストラクタと言います。
Javaなどでもコンストラクタがありますが、Pythonの場合は「__init__」で記載します。
このコンストラクタは簡単に言うと初期化です。このクラスを扱う場合、かならずコンストラクタが実行されるため、ここで初期化を行う事ができるのです。
1 2 |
def __init__(self,): #処理を記載 |
selfとは?
「self」という記述が出てきますが、このselfはインスタンス自身を指す変数です。
※他の言語によっては「this」などで扱われる事があります。
デストラクタ
オブジェクトが不要になり、削除される場合に実行される処理がデストラクタです。
初期処理のコンストラクタとは対をなす処理で、「後処理」だと思えばOKだと思います。
「del オブジェクト名」でデストラクタを実行できます。
ただ、Pythonの処理の場合は基本的にデストラクタは使用しないのが一般的です。
■Pythonコード
1 2 3 4 5 6 7 8 |
class TestClass: def __init__(self): print("proc init") def __del__(self): print("proc del") test_instance = TestClass() del test_instance |
■実行結果
1 2 |
proc init proc del |
継承
既存のクラスから、部分的に機能を変更・追加したクラスを定義して作成する事を継承と言います。
・規定クラスを元に派生クラスを作る
・親クラスから子クラスを作る
などとも言われますが、全て同じ意味で、しかも基本的にはそんなに難しい話じゃないです。
既にあるものを活用して、コーディングをする。というのはエンジニアであれば何度も経験する事だと思います。継承という概念を理解して、Python等のプログラムで実現する方法さえ知っていれば「継承」を使いこなせるのです!
継承をする際は以下の様な記述になります。
1 2 3 4 5 6 7 |
class クラス①: def メソッド名(): #処理を記載 class クラス②(クラス①): def メソッド名(): #処理を記載 |
「class クラス名(基底クラス名):」という記述で継承する事ができます。
※この場合はクラス名⇒クラス②、基底クラス名⇒クラス①です。
引数に基底クラスを渡すというのは、少し変な感じもしますがこれが記述ルールなので覚えておきましょう。
使用例を以下に示します。
■Pythonコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class TestClass1: def __init__(self): self.val0 = 1 def sum1(self,val1,val2): sum = val1 + val2 print(sum) class TestClass2(TestClass1): def __init__(self): self.val3 = 5 def sum2(self,val4,val5): sum = self.val3 + val4 + val5 print(sum) test_instance = TestClass2() test_instance.sum1(1,2) test_instance.sum2(1,2) |
■実行結果
1 2 |
3 8 |
まとめ
さて、クラスについては色々な使い方があるのですが、実際にPythonのコードを読んだり書いたりする上で必要そうな部分を中心にまとめました。
個人的なプログラムを作っている間は、そんなに使うものでもありませんが、チームでプログラムを書く際には特に重宝します。特に大規模な案件などで数百KStepにもなるコードを書く際には、クラスの考え方を開発者皆で認識合わせをしておかないと、後々でコードが最悪な事になってしまいます。
実際に使ってみないと何のために使用しているのか分かりにくいものでもありますので、ぜぜひぜひクラスを使用してみて下さいね。