Pythonでclassを定義するには?どんな場合に必要?
「class」はオブジェクト指向プログラミングをする上で非常に重要です。オブジェクト指向でコードを書くと、拡張性や保守性に優れたコードが書きやすくなります。
Pythonの「class」は他のプログラミング言語で使われている意味合いとそれほど違いはありませんが、記述方法などに若干の違いがあるため、他の言語を触れる方でもPythonにおける「class」を知っておく必要があります。
定義の方法や「class」を使うことでできるようになることなど、具体例も交えて解説していきます。
Pythonによるclassの使い方
プログラムを組む上で、様々な機能をまとめて扱いたいときがあります。そのような場合、クラスとしてまとめておくことで管理から開発、メンテナンスまで行いやすくなります。まずはPythonで定義する場合の記述方法などを説明していきます。
定義方法
Pythonでクラスを定義するには、「class」を記述したあとで任意のクラス名を設定すれば良いだけです。
例えば以下のような構文です。
class ClassName:
という形になっています。
しかしこれだけでは何の意味も持ちません。実際に使用する場面ではこれより下にメソッドやコンストラクタなどを定義していきます。
定義したクラスを利用する場合には、まずインスタンスを生成する必要があります。インスタンスの生成にはクラス名の後ろに「()」を付けます。さらにそのインスタンスを変数に代入します。この変数がオブジェクトの名前ということになります。
以下のような形になります。
x = ClassName()
インスタンスが何者か、ということはクラスとインスタンスの関係において設計図とそれを元に作られた製造物というように考えるとよいでしょう。
使用上の注意
Pythonでクラスを定義する場合、はじめに「class」というように小文字から始める必要があります。このほかコーディング規約がいくつかあり、それに従わなければ必ずエラーが起こるというものではありませんが、視認性を高めるためにもできるだけこれに沿って記述していくことが望ましいとされています。
クラス名を決めるときには単語の頭文字を大文字にして繋げるのも規約に記載されている内容です。上の例でも「Class」+「Name」という2つの単語を繋げています。
classでできること
クラスの定義ができるようになってもそれだけでは使い道がありません。そのため、クラスの内部に機能を持たせていく必要があります。クラスではメソッドやコンストラクタの定義ができます。
メソッドの定義
メソッドとは、ひとまとまりになった処理のことを言います。
class ClassName:
def my_method(self):
print(“Hello world”)
defは小文字で、クラス名と違いメソッド名は頭文字も小文字にします。
また、クラス内でメソッドとして定義する際には慣習的に第1引数に「self」を指定することとされています。
他の名前を指定した場合に機能しなくなるということではありませんが、できるだけこの慣習にしたがってプログラムを記述したほうが混乱を招きにくいでしょう。
ちなみに、この「self」はインスタンスそのものを指すため、クラス外で定義される関数には関係のないものです。
こうしたメソッドを「インスタンスメソッド」と呼びます。
インスタンスメソッドは、クラス内においてインスタンス自身を紐づかせるためのメソッドです。インスタンスメソッドは直接呼び出すことができないため、上記のコードだと「Hello world」を表示させることはできません。
メソッドには他にも「クラスメソッド」「スタティックメソッド」というものがあり、インスタンスメソッドと組み合わせて使っていきます。
次からはそれらの2つを使って「Hello world」を表示させる例を紹介します。
クラスメソッド
クラスメソッドの場合にはインスタンスメソッドのようにクラスをインスタンス化する必要はありません。
上の例を書き換えると以下のようになります。
class ClassName:
@classmethod
def my_method(cls):
print("Hello world")
ClassName.my_method()
# Hello world が出力される
「@classmethod」を記述することと、慣習的に第1引数に「cls」を指定するということが特徴的です。
この「cls」はクラス(class)のことで、インスタンスメソッドにおける「self」同様、指定しないと機能しないというものではありませんが、明示的にこれを指定することとされています。
スタティックメソッド
スタティックメソッドは、インスタンス化が必要ないという点はクラスメソッドとも共通していますが、「@staticmethod」と記述してデコレートすることと、「cls」や「self」などを第1引数に指定する必要がない点でクラスメソッドとは異なります。
class ClassName:
@staticmethod
def my_method():
print("Hello world")
ClassName.my_method()
# Hello world が出力される
コンストラクタの定義
コンストラクタもメソッドの一種です。しかしこれは特殊なメソッドで、インスタンスが生成された時点で自動的に呼び出すメソッドになります。
特殊なメソッドにもいくつか種類があり、これらを定義する際にはアンダースコアが名前の前後に付けられます。例えば「__new__
」は下の「__init__
」と違い、インスタンスが生成される前に呼ばれ、第1引数に「cls」を指定するという点でも異なります。
「__init__
」の場合には第1引数に「self」を指定して使用します。
実際にクラスの中でコンストラクタを定義し、これまでで説明したメソッドやインスタンスの生成もまとめて記述してみましょう。
class ClassName:
def __init__(self,name):
self.name = name
def my_method(self):
print("クラスの名前は「" + self.name + "」です。" )
x = ClassName("クラス1")
x.my_method()
# クラスの名前は「クラス1」です。 が出力される
デストラクタの定義
デストラクタとは、インスタンスが破棄されるときに自動て呼ばれるメソッドのことです。
コンストラクタ(初期化)の対になる処理で、ファイナライザと呼ばれることもあります。
これまで説明したコードにデストラクタを追加すると、以下のようになります。
class ClassName:
def __init__(self,name):
self.name = name
def __del__(self):
print('インスタンスが破棄されました')
def my_method(self):
print("クラスの名前は「" + self.name + "」です。" )
x = ClassName("クラス1")
x.my_method()
# クラスの名前は「クラス1」です。 が出力される
del x
# インスタンスが破棄されました が出力される
Pythonでclassが必要になるパターン
複雑なプログラムを組む場合、「class」はほぼ確実に必要になります。ゲーム制作やWeb開発、AI開発、統計処理、数学的研究、RPAでは基本的に「class」を使っていきます。
また、Pythonで提供されているライブラリはオブジェクト指向で書かれているため、「class」の知識を活かしてライブラリを拡張していくことができます。
そのため、クラスの定義やメソッド、コンストラクタといった知識はPythonを学ぶ上では必須です。しかし必要のないケースがあるのも事実です。
単純なデータ収集や自動化処理では不要
「class」が必要なくなるのは単純なプログラムの場合です。
例えば基本的な計算をプログラムで自動処理させる場合や、Webスクレイピングなどで代表されるデータ収集などがあります。他にもメールを自動送信させるような、単純な自動化処理などではクラスがなくても問題なくプログラムを組めることがあります。
まとめ
クラスはPythonを学ぶ上で必須の知識です。処理の内容によってはプログラム内にクラスを定義しないこともあり得ますが、クラスやメソッドなどの知識なくPythonのスキルをステップアップさせていくのは不可能です。
まずはクラスの内部でメソッドなどを定義、そしてこれを実行できる状態にするため変数に代入しインスタンスの生成を行います。これがクラスを定義する全体の流れになります。
また、クラスを定義する際には、内部のプログラムについても見やすさを意識するようにしましょう。記述したプログラムは自分以外の者が見ることもあります。誰が見ても理解できるよう統一感を出すことが大切になります。
コーディング規約がその役割を果たすため、インデントの方法など、視認性に関することを詳細に知りたい場合にはPythonのコーディング規約を一度確認してみましょう。
この記事のキーワードに関する勉強会・イベントを探す
TECH PLAYでは、ITエンジニア向けの勉強会・イベント情報を提供しています。
興味のある方はぜひご参加ください。