Pythonでclassを定義するには?どんな場合に必要?

プログラミング
Pythonでクラスを定義する場合でも、他の言語と大きな違いがあるわけではありません。しかしPython独自のコーディング規約に従って記述していく必要があり、小文字や大文字の使い分け、アンダースコア、インデントの方法などは確認する必要があるでしょう。
Pythonでclassを定義するには?どんな場合に必要?

「class」はプログラミングをする上で非常に重要です。Pythonに限らず、他のプログラミング言語でも使用されることがあります。classの持つ意味合いにそれほど違いはありませんが、記述方法などに若干の違いがあるため、他の言語を触れる方でもPythonにおけるclassを知っておく必要があります。
定義の方法やclassを使うことでできるようになることなど、具体例も交えて解説していきます。

Pythonによるclassの使い方

プログラムを組む上で、様々な機能をまとめて扱いたいときがあります。そのような場合、クラスとしてまとめておくことで管理から開発、メンテナンスまで行いやすくなります。まずはPythonで定義する場合の記述方法などを説明していきます。

定義方法

Pythonでクラスを定義するには、「class」を記述したあとで任意のクラス名を設定すれば良いだけです。 例えば以下のような構文です。

class ClassName:

という形になっています。
しかしこれだけでは何の意味も持ちません。実際に使用する場面ではこれより下にメソッドやコンストラクタなどを定義していきます。

定義したクラスを利用する場合には、まずインスタンスを生成する必要があります。インスタンスの生成にはクラス名の後ろに「()」を付けます。さらにそのインスタンスを変数に代入します。この変数がオブジェクトの名前ということになります。
以下のような形になります。

x = ClassName()

インスタンスが何者か、ということはクラスとインスタンスの関係において設計図とそれを元に作られた製造物というように考えるとよいでしょう。

使用上の注意

Pythonでクラスを定義する場合、はじめに「class」というように小文字から始める必要があります。このほかコーディング規約がいくつかあり、それに従わなければ必ずエラーが起こるというものではありませんが、視認性を高めるためにもできるだけこれに沿って記述していくことが望ましいとされています。
クラス名を決めるときには単語の頭文字を大文字にして繋げるのも規約に記載されている内容です。上の例でも「Class」+「Name」という2つの単語を繋げています。

classでできること

クラスの定義ができるようになってもそれだけでは使い道がありません。そのため、クラスの内部に機能を持たせていく必要があります。クラスではメソッドやコンストラクタの定義ができます。

メソッドの定義

メソッドとは、ひとまとまりになった処理のことを言います。関数とほとんど同じ性質を持ちますが、クラス内でメソッドとして定義する際には慣習的に第1引数に「self」を指定することとされています。
他の名前を指定した場合に機能しなくなるということではありませんが、できるだけこの慣習にしたがってプログラムを記述したほうが混乱を招きにくいでしょう。

ちなみに、この「self」はインスタンスそのものを指すため、クラス外で定義される関数には関係のないものです。 クラスを定義したときと同様の形で定義していきます。

class ClassName:
    def my_method(self):
          print(“Hello world”)

ただし、このままの形ではクラスのメソッドを呼び出すことはできません。やはり一度インスタンス化する必要があり、そうすることで「Hello world」を表示させることができます。
なお、defは小文字で、クラス名と違いメソッド名は頭文字も小文字にします。

こうしたメソッドを「インスタンスメソッド」と呼び、これに対して「クラスメソッド」「スタティックメソッド」というものもあります。
クラスメソッドの場合にはインスタンスメソッドのようにクラスをインスタンス化する必要はありません。
上の例を書き換えると以下のようになります。

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」です。』と表示されるようになります。

Pythonでclassが必要になるパターン

複雑なプログラムを組む場合、クラスはほぼ確実に必要になります。ゲームを製作する場合やWebアプリを作る場合なども基本的にクラスを使っていきます。
そのため、クラスの定義やメソッド、コンストラクタといった知識はPythonを学ぶ上では必須です。しかし必要のないケースがあるのも事実です。

単純なデータ収集や自動化処理では不要

クラスが必要なくなるのは単純なプログラムの場合です。
例えば基本的な計算をプログラムで自動処理させる場合や、Webスクレイピングなどで代表されるデータ収集などがあります。他にもメールを自動送信させるような、単純な自動化処理などではクラスがなくても問題なくプログラムを組めることがあります。

まとめ

クラスはPythonを学ぶ上で必須の知識です。処理の内容によってはプログラム内にクラスを定義しないこともあり得ますが、クラスやメソッドなどの知識なくPythonのスキルをステップアップさせていくのは不可能です。
まずはクラスの内部でメソッドなどを定義、そしてこれを実行できる状態にするため変数に代入しインスタンスの生成を行います。これがクラスを定義する全体の流れになります。

また、クラスを定義する際には、内部のプログラムについても見やすさを意識するようにしましょう。記述したプログラムは自分以外の者が見ることもあります。誰が見ても理解できるよう統一感を出すことが大切になります。
コーディング規約がその役割を果たすため、インデントの方法など、視認性に関することを詳細に知りたい場合にはPythonのコーディング規約を一度確認してみましょう。

この記事のキーワードに関する勉強会・イベントを探す

TECH PLAYでは、ITエンジニア向けの勉強会・イベント情報を提供しています。
興味のある方はぜひご参加ください。


おすすめのコラム