【入門者向け】Pythonでのクラスの使い方を徹底解説! | プログラミング入門ならWEBCAMP NAVI
【1月枠も残りわずか】転職保証コース

【入門者向け】Pythonでのクラスの使い方を徹底解説!

プログラミング

はじめに

Pythonも現在の他のメジャーな言語と同様、オブジェクト指向プログラミングを行う言語です。
オブジェクト指向は現代のプログラミング作業では必須の考え方で、Pythonに限らず覚えておく必要があります。
Pythonのプログラムにおけるデータは、全て、オブジェクトで表現されています。
文字列やリストなどさまざまありますが、すべてオブジェクトとして扱われます。

ここでは、オブジェクト指向の中でもPythonにおけるクラスについての説明を行っていきます。

オブジェクト指向のクラスという概念

まずはオブジェクト指向における「クラス」という概念、考え方を説明します。

クラスとはいわゆる「ある目的をもったものの定義」、つまり「設計図」です。
「ある料理を作りたい」といった場合に、まずは材料をどれだけ用意するかが必要になります。
そこから、どういった下ごしらえでやるか、そのためには包丁がいるのか、ミキサーがいるのか全て記す必要があります。
必要なものがすべてつまっていますが、それは設計図であり、料理そのものではありません。
つまり、クラスとは「あることを実現するための設計図」と理解して頂ければ分かりやすいと思います。

インスタンス(実体)とは

「インスタンス」とは、クラスを元に作成された実際のモノのことです。
先ほど述べた通り、クラスはあくまで『設計図』でしかありませんので、クラスだけがあっても何もできません。
実際に動作をさせるためにはそこから実際のモノを作って動作させます。
その実際のモノのことを「インスタンスと呼びます。
例えば、車のクラスがあった場合に、クラス自体は車の設計図にしか過ぎません。
そこからインスタンスを作って、実際に車として動作させるイメージです。
ちなみに、クラスからインスタンスを作ることを「インスタンス化」といいます。

クラスの定義方法

クラス名

まず、クラスの名前を最初に定義します。
testクラスという場合は以下のように定義します。


class Test:

冒頭にclassと書いて、その後にクラス名を書きます。クラス名の先頭は大文字である必要があります。
そして最後に「:」(コロン)を付けます。

メンバ(変数)

クラス内部で使用する変数を設定します。(任意)
注意としては、クラス名を記載して改行した後、メンバやその他の設定はインデント(段落)をいれてください。
例えば、testクラスにvalという数値を入れる変数を入れる場合は以下のように定義します。


class Test:
val = 100

メソッド(関数)

メンバと同じく、インデントを入れてメソッドも定義できます。
例えば、testクラスにmsgという関数を入れる場合は以下のように定義します。


class Test:
val = 100
def msg(self):
print('This is test')

冒頭にdefと書いて、その後にメソッド名を書きます。メソッド名は先頭を大文字にはしません。
最後にはクラスを同じように「:」(コロン)を付けます。
msgの後にあるself,dataというのは、引数と呼ばれるもので、必要な情報を渡すために使います。
関数は必ず一つ以上は引数を書く必要があり、pythonでの1個目の引数は[self」と決まっていますので、どんな関数でも


メソッド名(self):

とは最低限書くことになります。決して「メソッド名():」とは書きません。

また、「print(‘This is test’)」となっている部分が実際の関数の中身です。
クラス名の後の関数名でインデントを入れましたが、関数名の後の関数の中身を書く際もまたインデントを入れます。

クラスをインスタンス化する

先述の通り、クラスをメンバやメソッドで形成しても、そのままではプログラム実行でなにも起こりません。
インスタンス化して実行する必要があります。
先ほどまでのtestクラスを以下のように書きました。

class Test:
    val = 'This is test python')

def msg(self):
    print(self.val)

これをインスタンス化するには以下のように書きます。


test1 = Test()

test1は任意の名前です。インスタンス化した実体の名前になります。
Test()でクラスをインスタンス化しています。

メソッドの実行

インスタンス化することで、メソッドを実行することが可能になります。


test1.msg()

「インスタンス名.メソッド名(引数)」で呼び出します。
引数がない場合でも括弧は忘れないようにします。
これで、実際にプログラムを実行すると「This is test python」と表示されます。

コンストラクタ

インスタンス化(実体化)する時に自動的で実行されるメソッドをコンストラクタといいます。
コンストラクタ用のメソッドは関数名が固定で「__init__」という名前で作成します。
“_”を前後に2つになります。
以下のプログラムを例に解説します。


#coding: UTF-8

class Test2:
num = 0
def __init__(self,num):
self.num = num

def print_num(self):
print('numの値は{}です。'.format(self.num))

test2 = Test2(10)
test2.print_num()

このtestクラスをインスタンス化した場合、コンストラクタであるinit関数に基づき、引数numに設定した値がメンバ変数であるnumに格納されます。
今回は「10」を代入しています。
そしてメソッドであるprint_numを実行すると、「numの値は10です」と表示されます。

デストラクタ

デストラクタはコンストラクタとは逆のものです。
つまりインスタンス化したオブジェクトを破棄する場合に呼ばれるメソッドです。
デストラクタ用のメソッドは関数名が固定で「__del__」という名前で作成します。
“_”を前後に2つになります。
以下のプログラムを例に解説します。


#coding: UTF-8

class Test3:
    def __init__(self):
        print('コンストラクタを実行')

    def __del__(self):
        print('デストラクタを実行')

test3 = Test3()
del test3

「test3 = Test3()」でインスタンス化されますので、そのタイミングで「コンストラクタを実行」と表示されます。
「del test3」でインスタンスを破棄します。そのタイミングでdel関数が呼ばれ、「デストラクタを実行」と表示されます。

継承

クラスということでもちろん継承も可能です。
継承とは、別のクラスの持つ機能を自分自身に取り込むことです。
そうすることで、自分の機能+別クラスの機能も使用できるようになったり、別クラスのある機能を自分のクラス内で再定義し拡張したりすることもできます。
以下のようなプログラムを例に解説します。

#coding: UTF-8

class Test4:
    num = 0
    def __init__(self, num):
        self.num = num;

    def print_num(self):
        print('numの値は{}です。'.format(self.num))

class Test5(Test4):
    def print_info(self):
        print('Test5クラスはTest4クラスを継承しました。')
        super().print_num()

test5 = Test5(15)
test5.print_info()

Test4は引数で渡した数値を表示する機能を持っています。
それを継承したTest5をインスタンス化します。
引数で指定した「15」はTest5でも同じようにnumに格納されます。
そしてprint_infoでは「Test5クラスはTest4クラスを継承しました。」と表示した後、「super().print_num()」と記載されています。
このsuperというのは継承元のクラスを表します。ここではTest4ということになります。
なので、「super().print_num()」とは、Test4クラスのprint_num関数を実行することになりますので、「numの値は15です。」と表示されます。

privateとpublic指定

Pythonではクラスのメンバ変数やメソッドの名前の前に”__”をつけることによりprivateにできます。
privateとはクラス内部でのみ干渉可能ということになります。
何もつけなければpublic、通常通りの動作です。
具体的にはインスタンス化した実体から「直接呼ぶことはできません」
クラス内の別のメソッドなどからは呼び出すことが出来ます。
以下のプログラムを例に解説します。

#coding: UTF-8

class Test6:
__num = 0
def __init__(self):
self.__num = 22

def print_num(self):
self.__print()

def __print(self):
print('numの値は{}です。'.format(self.__num))

test6 =Test6()
test6.print_num()
test6.__print() #ERROR!
test6.__num #ERROR!

Test6では、メンバ変数numと、メソッドprintがprivate、つまり内部のみのアクセスできる状態です。
逆にメソッドprint_numはpublicです。
そのため、print_numの呼び出しは成功しますが、printやnumをインスタンスから呼び出そうとするとエラーになります。
print_numはその中身でprintを呼ばしていますし、printはその中身でnumを呼び出していますが、クラス内部からの干渉なのでエラーにはなりません。

さいごに

Pythonのクラスについて解説いたしました。
クラスの概念はオブジェクト指向を理解されている方にとってはなじみのある内容化と思います。
文法的に多少覚えることがありますが、やはりPythonはシンプルに記載できて直感的にわかるようにできていると思います。
ご自身でクラスを作成してみて、実際にどうなるか色々試してみてください。

 

1月枠も残りわずか!!

エンジニア転職を目指すなら…

転職保証付きプログラミングスクール

で未経験からエンジニア目指そう

 

✔︎未経験からの転職 ✔︎会社の将来が不安 ✔︎給与や待遇に不満がある

 

転職保証コースは質の高いカリキュラムで転職成功率98%

 

転職保証付のDMM WEBCAMPで
安心してエンジニア転職を目指そう

「スキルがないし…」「失敗したくないし…」
カウンセラーがあなたのキャリアを真剣に考え、
ご相談に乗ります。