【Python】コードが劇的に読みやすくなる「クラス」の使い方を徹底解説

コラムCOLUMN

【Python】コードが劇的に読みやすくなる「クラス」の使い方を徹底解説

2021/06/03

Pythonのコードを書く際に、同じような処理がいろいろなところに分散してしまって困ったことはありませんか。

コーディングの基本は、同じような処理を可能な限り共通化して、一つの処理につき一箇所だけ直せば良いようにすることです。

Pythonにもクラスの記法があります。

クラスを使うと、同じような処理を一箇所にまとめることが簡単にできます。

プログラムの修正が簡単になり、可読性も上がるため、フリーランスエンジニアにとっては是非とも身に付けておきたいスキルです。

この記事では、Pythonでのクラスの使い方を解説します。

Pythonでのクラスの宣言

Pythonでクラスを使うために、まずは宣言の方法から解説します。

クラスの宣言

Pythonでクラスを宣言するには、「class」というキーワードを使います

具体的には以下のように記述します。


   class MyClass:
	    pass

これで、MyClassという空のクラスが宣言できました。

クラスの中身の定義

変数の定義

クラスは、データを保存するための変数を持つことができます

以下のように定義することで、クラスのインスタンスを作成すれば変数の値を使うことができます。

変数はクラス変数とインスタンス変数の二つに分けることができます。

クラス変数は違うインスタンス間で値が同一になります。

インスタンス変数はインスタンスごとに独立した値になります。

クラス変数とインスタンス変数の定義方法は以下の通りです。

まだ紹介していない「def」と「init」については、この後methodの項目で紹介します。


   class MyClass:
	   classVal=”test” # > クラス変数の定義
	   def __init__(self, arg):
		    self.instanceVal=”instanceVal” # >インスタンス変数の定義

methodの定義

methodとは、ある処理を一つのまとまりにし、名前を付けたもののことを指します

methodは、「def」というキーワードを使って定義します。

特徴として、クラス内の処理であるmethodは、第一引数に「self」という引数を取ります。

これはそのmethodが定義されているクラスのインスタンス自身を表す引数です。

サンプルコードは以下の通りです。


   class MyClass:
	   def my_method1(self): # >methodの宣言。第1引数にselfをとります。
	          print(“my_method1”+self.classVal)

	   def my_method2(self,arg): # >methodの宣言。第2引数以降に任意の引数を取ることもできます。
	          print(“my_method2”+str(arg))

	   classVal=”test” # > クラス変数の定義。
	   def __init__(self):
	          self.instanceVal=”instanceVal” # >インスタンス変数の定義。

特別なmethod

methodの中には、特定のタイミングだけで呼び出される特別なmethodがあります。

この記事では二つ紹介します。

コンストラクタ(initメソッド)

コンストラクタは、クラスのインスタンスを生成する際に、自動的に呼び出されるmethodです。

コンストラクタを定義しなくてもクラスを定義することはできますが、コンストラクタを定義することによってクラスの初期化を一箇所にまとめて書くことができ、可読性の向上や保守性の向上につながります。

主にインスタンス変数の定義に使うと便利です。

コンストラクタを定義するには、「__init__」という特別な名前でmethodを定義します。

そのほかの決まりはmethodと同じです。


   class MyClass:
	   def my_method1(self): # >methodの宣言。第1引数にselfをとります。
		   print(“my_method1”+self.classVal)

	   def my_method2(self,arg): # >methodの宣言。第2引数以降に任意の引数を取ることもできます。

	   classVal=”test” # > クラス変数の定義。
	   def __init__(self): # >コンストラクタの宣言。
		   self.instanceVal=”instanceVal” # >インスタンス変数の定義。

デストラクタ(delメソッド)

デストラクタは、クラスのインスタンスが破棄される際に、自動的に呼び出されるmethodです。

デストラクタを定義しなくてもクラスを定義することはできますが、デストラクタを定義することによってクラスが破棄される際の処理を一箇所にまとめて書くことができ、可読性の向上や保守性の向上につながります。

主にリソースの解放に使うと便利です。

デストラクタを定義するには「__del__」という特別な名前でmethodを定義します。

そのほかの決まりはmethodと同じです。


   class MyClass:
	   def my_method1(self): # >methodの宣言。第1引数にselfをとります。
		   print(“my_method1”+self.classVal)

	   def my_method2(self,arg): # >methodの宣言。第2引数以降に任意の引数を取ることもできます。

	   classVal=”test” # > クラス変数の定義。
	   def __init__(self): # >コンストラクタの宣言
		   self.instanceVal=”instanceVal” # >インスタンス変数の定義。

           def __del__(self): #デストラクタの宣言
                   print("del")

クラスの使い方

クラスの使い方

クラスは定義しただけでは使えません。

宣言や継承をして、さまざまな方法で使用します。

この項目ではクラスの使い方について紹介します。

初期化

クラスを使うには、まずインスタンスを初期化する必要があります。

Pythonでクラスを初期化するには、関数を実行するときと同じように、クラス名の後にかっこ「()」をつけて変数に代入します。

コンストラクタにself以外の引数を持っている場合には、かっこの中に値を記入します。

以下のように記述することで、クラスのインスタンスを初期化することができます。


   instance1=MyClass() # >コンストラクタに引数のないクラスの初期化
   instance2=MyClass(value) # >コンストラクタに引数のあるクラスの初期化

methodを使うにはselfが必要

クラス内に定義した関数であるmethodをクラス内で使用するには、自分自身のインスタンスを示す「self」から呼び出す必要があります。

以下のように記述することで、クラス内でクラス自身が持つmethodを呼び出すことができます。

変数についても同様です。

クラス内で呼び出すためには、「self」から呼び出す必要があります。


   class MyClass:
	   classVal=”test” # > クラス変数の定義。
	   def my_method1(self): # >methodの宣言。第1引数にselfをとります。
		   print(“my_method1”)

	   def my_method2(self,arg): # >methodの宣言。第2引数以降に任意の引数を取ることもできます。
		   self.my_method1() # >クラス自身のmy_method1を呼び出しています。
		   print(“my_method1 called”)
		   print(self.classVal) # >クラス自身のclassValを呼び出しています。

継承

クラスの目的は、同じ処理を一箇所にまとめることであると説明しました。

全く同じ処理をするのであれば、今まで紹介したクラスを定義すれば問題ありません。

しかし、似ているものの、若干異なる処理をする場合にはどのようにすれば良いでしょうか。

Pythonのクラスにも、継承という機能があります。

継承を使うことで、似たような処理を行うクラスを簡単に作成することができます。

継承の説明

継承とは、クラスの機能を再利用することや追加することなどができる機能です。

継承を使うことによって、継承先クラス全てに変更が発生した場合でも、継承元クラスに定義したmethod・インスタンス変数を修正するだけで、全ての継承先クラスを修正できます。

ソースコードの記述量と修正の手間を大幅に削減できるため、効率良く業務を行うことが必要なフリーランスエンジニアとしては、身に付けておきたい技術です。

継承の仕方

Pythonでの継承は、クラスの宣言時にクラス名の後ろへかっこ「()」をつけ、その中に継承元のクラス名を記述することで実現できます。

継承先クラスのインスタンスから、継承元のmethod・インスタンス変数を呼び出すこともできます。

あたかも継承先クラスのインスタンスのメンバであるかのように呼び出すことができます。

サンプルコードは以下の通りです。


   class ParentClass:
	    parentClassVal=” parentClassVal”

   class ChildClass(ParentClass):
	    childClassVal =” childClassVal”

   child= ChildClass()
   print(child.childClassVal) #childClassVal
   print(child.ParentClassVal) #ParentClassVal 継承元クラスのインスタンス変数を呼び出せます。

super修飾子について

継承先クラスの内部から継承元クラスのmethod・インスタンス変数にアクセスするときには、その先頭に「super()」とつける必要があります。

今まで紹介してきた「self」と似たような使い方で、継承元クラスを意味するキーワードです。

サンプルコードは以下の通りです。


   class ParentClass:
	    parentClassVal=” parentClassVal”

   class ChildClass(ParentClass):
	    childClassVal =” childClassVal ”+super().parentClassVal

   child= ChildClass()
   print(child.childClassVal) #childClassVal parentClassVal
   print(child.ParentClassVal) #ParentClassVal 継承元クラスのインスタンス変数を呼び出せます。

その他のPython学習に必要な知識

その他に、Pythonを学習する上で必要な知識を紹介します。

ライブラリを読み込むための文「import」

Pythonの魅力は、豊富なライブラリを利用できるという点です。

importは、別のファイル(モジュール)に記述されたコードを取り込む機能で、プログラム内でライブラリを利用するときに使用します。

クラスとは別の考え方ですが、ライブラリを駆使してコーディングを行うPythonエンジニアとしては必須の知識です。

importを利用するには、以下の記述をします。


           import {ライブラリ名}
   ライブラリの一部の機能を利用したい場合には、以下の記述をします。
	   from {ライブラリ名} import {機能名} 

クラスの変数を安全に扱うための「property」

propertyは、オブジェクト指向でいうところのカプセル化を実現するための機能です。

カプセル化することによって、意図しない処理からクラス内のインスタンス変数を保護することができます。

宣言の方法のサンプルコードは以下の通りです。


   class MyClass(object):
           def __init__(self, sample):
        	    self._sample = sample
	   @property
	   def sample(self):
		    return self._sample

	   @sample.setter
	   def sample(self, val):
		    self._sample=abs(val)

まとめ

Pythonにおけるクラスについて、定義の仕方と使い方を紹介しました。

クラスを使うことでソースコードの可読性と保守性が上がり、作業効率も上がります。

フリーランスエンジニアとしては習得しておきたいスキルです。

また、Pythonを使用できるエンジニアの需要は拡大しており、フリーランスITエンジニア専門エージェントの「i-common tech 」 でも、Pythonを使用する案件を多数扱っています。

当サービスで扱うPython案件は、平均月額報酬が約87,5万円と高額な報酬を見込むことができ、フリーランスエンジニアの市場価値を上げられるような案件に参画できる可能性があります。

当サービスでは、案件の紹介だけでなく、面談前後でのフォローや契約内容・契約延長の代理交渉なども行っています。

そのため、効率的に希望する案件を獲得することにもつながります。

サービス利用は無料です。

フリーランスエンジニアとして独立をお考えの人や、フリーランスエンジニアとして活躍の幅を広げたいとお考えであれば、利用してみてはいかがでしょうか。