Python入門|class(クラス)の基本・使い方と定義方法のイメージ画像

Python|class(クラス)の基本・使い方と定義方法

  • 公開日:2018/09/03
  • 更新日:2018/10/19
  • 投稿者:n bit

class(クラス)の概念について理解出来るとデータ型やメソッド等に対する理解も深まり今よりも使いこなしやすくなります。そしてクラスの学習はPythonのオブジェクト指向を理解するための第一歩。

慣れるまでは感覚をつかむのに少し苦労すると思いますが、できる限りクラスに対するイメージをつかみやすくするため噛み砕いて説明しています。

クラスが利用できるようになるとよりハイスペックなコードが記述できるようになりますので頑張って学習していきましょう。

  • Python

この記事は約 分で読めます。(文字)

Pythonのclass(クラス)とは

class(クラス)は関数に比べると少し複雑で特に概念が捉えにくいもの。最初から細かいところや正確性を追求するよりもざっくりイメージを掴み扱える様になることを優先させるのがおすすめです。

このページでは一通りクラスの流れを体験してから後ほど部分に分解して詳しく解説していきます。まずはクラスの概念的なところからです。

  • クラスとは、インスタンスに共通で利用する値(データ)や特定の実行処理を行うプログラムを一つにまとめた設計図の様なもの

Note

インスタンス (instance)とは『実態』と言う意味。

変数にクラスを格納することでクラスがインスタンス化(実体化)され、クラスが持つデータや実行処理を呼び出せる様になります。

下記のサンプルコードを使って実際の動きを確認してみましょう。サンプルコードは前回学習した関数のところでも利用したコードをクラス用に置き換えたものです。ここでは内容まで細かく把握する必要はありません。まずは動きだけでも確認してください。

サンプルコード

class NameCheck:


def __init__(self, text):
self.text = text
self.length = 0

def text_len(self):
for i in self.text:
self.length += 1
return self.length

def even_or_odd(self):
if self.length % 2 == 0:
return '偶数'
else:
return '奇数'

サンプルコードのクラスでは共通で利用する値や関数がまとめられていることが確認できます。これらの値や関数を呼び出せるようにするため最初にクラス『NameCheck』を変数に格納してインスタンス化します。

x1 = 'たろう'


# クラス『NameCheck』をインスタンス化
nc_ta = NameCheck(x1)

インスタンス化されましたので実際にクラス内に定義されている関数などを呼び出してみましょう。クラス内の値や関数を呼び出すにはインスタンスの変数名の後に値や関数の名前を『ドット:(.)』を挟んで付け足すことにより呼び出せます。

# 変数lengthに格納されている値を呼び出す

len1 = nc_ta.length
print(len1)

# 文字数を測る関数text_lenを実行
y1 = nc_ta.text_len()
print(y1)

# 変数lengthに格納されている値を呼び出す
len2 = nc_ta.length
print(len2)

# 偶数か奇数かを判定する関数even_or_oddを実行
y2 = nc_ta.even_or_odd()
print(y2)

出力結果

0 # print(len1)

3 # print(y1)
3 # print(len2)
奇数 # print(y2)

クラス内に設定していた値や関数が呼び出せていることが確認できました。

これだけではイメージが掴みにくいので今まで学習してきた内容も交え分解ながら説明していきます。

データの型 = class

実はここまでで学習してきたint、float、string、list、dict等のデータ型はすべてクラスです。試しに『データ型の基本【種類と特徴】』のページでも利用したtype関数を使ってデータ型を表示させてみましょう。

x = 10

print(type(x))

出力結果

<class 'int'>

出力結果を確認すると型の前に『class』と表示されているのが分かります。これはそれぞれのデータ型がクラスであることを表しているのです。

つまり、データ型はすべてクラスで出来ています。

type関数について忘れてしまった方は下記のページでご確認ください。

インスタンス

それぞれのデータ型はいちど変数に格納することで利用できるようになりましたね。このことをインスタンス化すると言います。

インスタンス (instance)とは『実態』と言う意味で、変数にclassを格納することによりclassを実体化(インスタンス化)させることができます。

classのインスタンス化

x = {'a':100}

print(type(x))

出力結果

<class 'dict'>

データ型では値を変数名に格納することでインスタンス化できていました。直接データ型のクラス名を変数に格納することでもインスタンス化できます。

classのインスタンス化

x = dict()

print(type(x))

出力結果

<class 'dict'>

classを実体化させると言われてもピンときませんよね。classとインスタンスの話を正確性よりイメージのしやすさを優先して少し説明しておきましょう。

そもそもクラスは実体のあるモノではなくどのようなモノかを定義するための設計図や仕様書のような役割を果たしています。

そしてインスタンスはそのクラスの設計図を元にして作成された実態です。そのため1つのクラスから複数のインスタンスを生成することができ、それぞれのインスタンスは同じ設計図を元に作成されているため同じような仕様で扱うことができます。

例えばデータ型の辞書も複数の変数名で作成することができ、それぞれの変数はすべて同じ特性を持った動作をしましたよね。

x1 = dict()

print(type(x1))

x2 = dict()
print(type(x1))

出力結果

<class 'dict'>

<class 'dict'>

すごく荒い例えになりますが、たこ焼きの金型(class)とたこ焼き(インスタンス)の関係のようなものです。金型を使えばいくつでも同じ形や大きさのたこ焼きを量産することができますよね。

クラスはたこ焼きの金型の様に実態を持たない設計図だけのため、利用するには必ず最初にインスタンス化して実態を持たす必要があるのです。

今後、インスタンス化すると言えば『クラス:(設計図)』を使って『インスタンス:(実態のあるモノ)』を生成しているとイメージしてください。

class(クラス)にするメリット

class(クラス)にするメリットは1つの設計図を下にして複数のインスタンス(クラスが格納された変数)を全て管理できること。基本的に関数のメリットと同じです。

  • 1:繰り返し同じ機能を簡単に再利用できコード量が減る
  • 2:コードが機能毎にまとまり読みやすいプログラムになる
  • 3:コードのメンテナンス性が大幅に向上する

詳細を忘れてしまった人は下記ページで再確認しておきましょう。

またクラス内で共通の値(データ)を使い回すことができますので、リストや辞書等の共通データが複数の関数間で利用されコードが複雑になってくるような場合でも管理しやすくなります。

Python class(クラス)の定義方法

Pythonでは関数と同じように最初から用意されたデータ型以外にも独自のクラスを定義することができます。Pythonのクラスを定義するには、『class』の後に『任意のクラス名』をつけて最後にコロン『:』付け加えれば1行目の定義文が完了です。

class 任意のクラス名:

pass

2行目以降はインデントブロックを行いクラスの内容を定義していきます。インデントブロック内は何も記述しないとエラーとなるため今回は説明用にpassだけを記述しました。pass文は何もしないことを定義しています。

class(クラス)名の命名ルール

クラス名は任意でつけることができますが通常は最初の1文字目を大文字に、そして複数の単語を利用する場合は単語の切れ目ごとに1文字目を大文字にするのが一般的です。

class SampleName:

pass

関数では全て小文字で単語の接続には_を使うのが一般的でした。

def sample_name:

pass

関数名やクラス名はこのような一般的な命名ルールに従ってつけておくことで名前を見ただけでも関数なのかクラスなのかをすぐに見分けることができ便利。自分が記述した以外のコードを読む時も命名ルールに対する慣れがあり判読しやすくなります。

メソッド

最初に利用したサンプルコードのようにクラス内には様々な関数をまとめて定義することができます。このクラス内に定義される関数のことを『メソッド』と呼びます。通常の関数とは違いメソッドは必ず定義されているクラス経由で呼び出さなければいけません。

  • クラス内の関数 = メソッド

各メソッドの定義方法は通常の関数の定義方法とほぼ同じです。

メソッドの第一引数 self

通常の関数と違いメソッドの第一引数には必ず『self』を指定するのがルールとなっています。selfは単語の意味の通り自身を指すものです。ここでは自身のデータを受け渡すために必要となる引数とだけ理解しておきましょう。

class SampleName:


def func1(self):
pass

インスタンス変数

クラス内で共通利用する変数には、必ず変数名の前に『self』をつけてください。『self』がついていない変数はその変数を定義したメソッド内でしか利用することができません。

このクラス内で共通利用する変数のことを『インスタンス変数(クラス内で共通利用する属性)』と呼びます。

例えば下記のようなサンプルコードでは変数『var_x』はメソッド『func1』でしか定義されていないためメソッド『func2』では変数『var_x』をそのまま扱えないのです。

class SampleVar:


def func1(self):
var_x = 1
return var_x

def func2(self):
return var_x

変数名の前に『self』をつけるとでクラス自身が持つ変数(インスタンス変数)として扱うことができ、クラス内の全てのメソッドで引数『self』を経由して共通利用できます。

class SampleVar:


def func1(self):
self.var_x = 1
return self.var_x

def func2(self):
return self.var_x

コンストラクタ

クラス内に定義するメソッドの中でも特殊なメソッドに 『コンストラクタ』があります。コンストラクタはクラスのインスタンスが生成されるとき自動的に呼び出されるメソッドです。

クラス内にコンストラクタが定義されている場合、インスタンス生成時自動的にコンストラクタが呼び出されて実行されますのでクラス内で利用する共通変数等の定義によく利用します。主に内容の初期化を行うため『初期化メソッド』とも呼ばれています。

コンストラクタのメソッド名は『 __init__ 』で定義してください。initの前後にはアンダーバー『 _ 』が2つずつ付いていることに注意しましょう。

class SampleName:

def __init__(self):
pass

def func1(self):
pass

引数

各メソッドに設定する引数は『self』の後に続けて指定してください。

インスタンス生成時に渡す引数はコンストラクタの引数として扱われます

class SampleVar2:

def __init__(self, no):
self.var_x = no

def func1(self, add_no):
self.var_x += add_no
return self.var_x

def func2(self, add_no):
self.var_x += add_no
return var_x

実行

# SampleVar2をインスタンス化

sv2 = SampleVar2(5)

# 変数var_xに格納されている値を確認
print(sv2.var_x)

# func1に引数を渡して実行
y1 = sv2.func1(10)
print(y1)

# func2に引数を渡して実行
y2 = sv2.func1(20)
print(y2)

出力結果

5

15
35

インスタンス化時に渡した初期値5が共通で利用できる変数self.var_xに格納されていることを確認できます。

python class(クラス)の使い方

このページの最初の概要解説で利用した以下のサンプルプログラムを用いてクラスの利用方法を説明していきます。

class NameCheck:




def __init__(self, text):

self.text = text

self.length = 0



def text_len(self):

for i in self.text:

self.length += 1

return self.length



def even_or_odd(self):

if self.length % 2 == 0:

return '偶数'

else:

return '奇数'

インスタンス化

クラスを利用するためにはまずインスタンス化する必要がありましたね。最初にクラスをインスタンス化しましょう。

インスタンスは

  • 変数名 = クラス名(引数)

で生成できます。

引数selfに関しては自動的に処理されますのでインスタンス化する時やメソッド呼び出し時には気にする必要がありません。

x1 = 'たろう'



# クラス『NameCheck』をインスタンス化

nc_ta = NameCheck(x1)

インスタンスが持つ値の呼び出し

インスタンスが持つ値は

  • インスタンス名.値を格納している変数名

で呼び出します。

# 変数lengthに格納されている値を呼び出す

len1 = nc_ta.length
print(len1)

出力結果

0

インスタンスが持つメソッドの呼び出し

インスタンスが持つメソッドは

  • インスタンス名.メソッド(引数)

で呼び出します。

# 文字数を測る関数text_lenを実行

y1 = nc_ta.text_len()
print(y1)

# 偶数か奇数かを判定する関数even_or_oddを実行
y2 = nc_ta.even_or_odd()
print(y2)

出力結果

3 # print(y1)

奇数 # print(y2)

今日のdot

class(クラス)はインスタンスが共通で利用する値やメソッドをひとまとめにした設計図』です。クラスを元にして複数のインスタンスを生成することでクラス内に持つ値やメソッドを利用できます。

初学でクラスを完全に理解するのはなかなか難しいです。まずは上記の項目だけでも覚えて実際に色々とクラスを記述してみたり使ってみたりしてみましょう。

クラスから複数生成されたインスタンスはそれぞれ初期値に与えた別々のデータをもちますが、クラスで定義している同様のメソッドを使って処理できるところがポイント。つまり、同じような振る舞いを行うことができるインスタンスをいくつでも作れるのです。

関数にもどことなく似ていますがクラスの方がより複雑なことができます。今回は解説していませんが作成したクラスをベースにして新しい派生クラスを作る『継承』機能等も用意されていて、基本機能と派生機能別ファイルに分けて管理することも可能です。

このクラスの様に値やメソッド等を保持したモノを『オブジェクト』と呼びます。『オブジェクト』については詳しく解説し出すと長くなるのでまた別の機会に詳しく解説します。

クラスに対する知識が深まればオブジェクト指向のプログラミングについても理解しやすくなりますので実際に使っていきながら徐々に理解度を深めていきましょう。