【Python入門】クラスの基本―完全版

Python

Pythonにおけるクラスの定義方法から、コンストラクタ・メソッド・メソッド・クラス変数/インスタンス変数まで、初心者向けに分かりやすく解説します。

このページを理解できれば、Pythonでクラスを用いて簡単なコーディングができるようになるよう丁寧に解説します。

このページで学べる内容
  • クラスの定義方法
  • コンストラクタとは?コンストラクタの実装方法
  • メソッドの定義方法
  • クラス変数とは?

オブジェクト指向の基礎がイマイチよくわかっていない方でも大丈夫です。1から分かりやすく解説していきますので、是非最後までご覧ください。

Python:クラスの定義方法

そもそもクラスって何?という方も、まずはクラスのコーディング方法・構文ルールから学んでいきましょう。

理由としては、コーディングの内容が掴めていない状態でクラスについての説明を行っても、クラスが何者であるかを理解することはかなり困難だから。(これは筆者の体験談です

そのため、本ページでは「実装方法」⇒「概念」の順に説明します。

まずは、クラスの定義方法です。

クラス定義:構文ルール

class (クラス名称):
   クラスの実装①
   クラスの実装②
   ・・・・

class TestClass:
    pass          # pass については以下で解説

「class」と書いて、クラス名を記述すればOK。これだけでクラスの定義ができます。

尚、クラスの実装内容は、"class" よりも1つインデントを下げて記述する必要があります。(これは、Python共通の仕組みです。詳細は「Python:基本文法」をご覧ください。

クラスの命名時に気を付けるポイントは以下の通り。

クラスの命名規約( PEP8 )
  • クラス名の頭文字は常に大文字で記述する(例:Sample
  • クラス名称が複数ある場合は、常に頭文字を大文字で記載する。(例:SampleClassName

インスタンスの生成(インスタンス化)

インスタンスの生成(インスタンス化)とは、クラスからオブジェクトを生成することです。

どういうことか。

クラスは、あくまでも「どのようなものか?を定義した設計書」にすぎません。クラスとインスタンスを、車で例えると以下のような感じ。

車で例えると・・・?
  • クラス     ⇒ 設計書
  • インスタンス化 ⇒ 設計書から車を作ること
  • インスタンス  ⇒ 車

つまり、クラスを定義しただけでは、まだ実際に「もの」は作られていないということ。インスタンス化をすることによって、はじめて「もの」が作成されるわけです。

したがってクラスを利用する場合には、必ずインスタンス化が必要になります。

インスタンスの生成は非常に簡単。「インスタンス = クラス名()」とするだけ。

class SampleClass1 :
    pass

aaa = SampleClass1()     # インスタンス化

これで、クラス"SampleClass1"を基にした実態―インスタンス "aaa" が生成されます。

class SampleClass1 :
    pass

aaa = SampleClass1()     # インスタンス化
bbb = SampleClass1()     # インスタンス化

もちろん、上記のように1つのクラスから複数のインスタンスを生成することも可能です。

これでクラスとインスタンスの基本理解はOK。

ここからは、クラスの中身(メソッドやコンストラクタ)について解説していきます。

Python:メソッド

まずは、メソッドの実装方法。メソッドと言っても、考え方は関数と全く同じ。

クラス内に定義された関数をメソッドと呼んでいるだけです。

# これは「関数」
def sample_function():
    print('Hello World!')
  
  
class SampleClass:
    # これは「メソッド」
    def sample_method():
        print('Hello World!')
関数とは?

複数の処理を1つにまとめて名前を付けたものです。

プログラムをコーディングしていくと、同じような処理を複数回必要とする場合がでてきます。このようなタイミングで、当該処理を予め構造化しておいて、何度も呼び出す形で利用することができればコード全体の「構造化」と「効率化」を向上させることが可能です。

Pythonでは、def文を用いて関数を定義します。

本ページでは、以下のページで解説している「引数」や「戻り値」に関する基本知識があると理解が進みます。自身がない方は一度ご覧になってから戻ってきてみてください。

ただし、普通の関数とメソッドで1点だけ異なるのが、メソッドは必ず1つ以上の引数を持つということです。

どういうことか。構文ルールとサンプルコードを学習しながら、合わせて解説していきます。

メソッドの定義:構文ルール

メソッドの定義

def メソッド名 (self, 引数):
    メソッドの実装①
    メソッドの実装②
    ・・・・

メソッドの呼び出し

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

class SampleClass1 :
    def method1(self):
        print("Hello World!")

instance = SampleClass1()     # インスタンス化

instance.method1()            # メソッドの呼び出し


# 結果 ⇒ Hello World!

メソッドを定義する際には、かならず "self" という引数を指定する必要があります。この "self" というのは、インスタンス自身を表す引数で、必ず1番初めの引数として記述します。

※必ずしも"self"でなければいけないわけではありません。キーワードは何でもOK(this や myselfなど)。ただし、Pythonエンジニアの慣例として"self"と記述することがほぼ決まっています。他の人でも理解できるように基本"self"と記述するようにしましょう。

この解説だけでは"self"がなにものなのか、正直まだよくわからない方もいらっしゃるかと思います。

"self" については、初心者向けにもう少し詳しく説明します。

"self" が分からない!

先ほど "self" はインスタンス自身を表す引数であると説明しました。これがどういうことかを、実際のコードで説明します。

class SampleClass:
    # メソッド1「引数messageの値を表示する」
    def s_method1(self,message):
        print(message)
        
    # メソッド2「メソッド1を呼び出す」
    def s_method2(self):
        self.s_method1("Hello World!")

ins = SampleClass()               # インスタンス化
ins.s_method2()                   # メソッドの呼び出し


# 結果 ⇒ Hello World!

このプログラムを2つに分解してみてみましょう。 まずはこの部分。

    # メソッド1「引数messageの値を表示する」
    def s_method1(self,message):
        print(message)

メソッド "s_method1" では、画面に引数 "message" の値を出力する処理を定義しています。

先ほど、解説した通りメソッドには必ず第1引数として、"self" を指定する必要があるのでした。

次にこの部分。

    # メソッド2「メソッド1を呼び出す」
    def s_method2(self):
        self.s_method1("Hello World!")

メソッド "s_method2" の処理は、先ほど定義した "s_method1" の呼び出し。引数 "message" には文字列 "Hello World!" を渡しています。

注目していただきたいのがメソッドの呼び出し部分「self.s_method1("Hello World!")」です。

先ほど解説した通り、メソッドの呼び出し時には必ずインスタンスを指定する必要があります。

【復習】メソッドの呼び出し方法

メソッドの呼び出し

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

instance.method1()            # メソッドの呼び出し

ただし、クラスの中ではまだインスタンスが生成されていません。そのために必要なのが "self" です。この "self" はこのクラス自身を表しているのです。

self.s_method1("Hello World!") 」を日本語に直すと「このクラスの中の、s_method1を呼び出すよ!」ということになるのです。

これで、なんとなく "self" の意味が分かったのではないでしょうか?

今すぐにはわからなくても、"self" はメソッドを定義する際に必ず第1引数に指定する必要があると理解しておけばOKです。

ここまでで、クラス・メソッド(self)の理解はOK。次は、コンストラクタについて。

Python:コンストラクタ

コンストラクタは、オブジェクトが生成される時に一度だけ実行されるメソッドのことです。基本的には、初期化を目的として利用されます。

基本的にはメソッドの考え方が理解できていればOK。オブジェクトが生成されるときに実行されるということがどういうことかが説明できるようになれば、コンストラクタも理解できます。

構文ルール:コンストラクタ

def __init__(self,引数,引数):


コンストラクタは「 __init__ 」という名前で固定です。init の前後に "_"(アンダーバー)2つです。

class SampleClass():
    def __init__(self):
        self.aaa = 2020
        self.bbb = "Hello World"

ins = SampleClass()
print(ins.aaa)
print(ins.bbb)


# 結果 ⇒ 2020
# 結果 ⇒ Hello World

コンストラクタで、変数 "aaa" と変数 "bbb" を宣言。その後で、その中身を表示するだけのコードです。

インスタンスが生成される時点で、変数”aaa” "bbb" にそれぞれの値を格納しています。

それでは、この場合はどうでしょうか。

class SampleClass():
    aaa = 2021                   # 変数の初期値 ⇒ 2021
    def __init__(self):
        self.aaa = 2020
        self.bbb = "Hello World"

ins = SampleClass()
print(ins.aaa)
print(ins.bbb)



# 結果 ⇒ 2020
# 結果 ⇒ Hello World

結果は全く同じです。インスタンスが呼び出された時点で、自動的にコンストラクタが実行されるため、変数"aaa"は「2020」で上書きされます。

Python:デストラクタ

コンストラクタの反対、インスタンスが破棄されるタイミングで一度だけ呼び出されるメソッドです。

class SampleClass():
    # コンストラクタ
    def __init__(self):
        self.aaa = 2020
        self.bbb = "Hello World"

    # デストラクタ
    def __del__(self):
        print("さようなら")

ins = SampleClass()
print(ins.aaa)
print(ins.bbb)

del ins # インスタンスの破棄



# 結果
2020
Hello World
さようなら

del ins」―。インスタンスを破棄したタイミングで、デストラクタの処理「print('さようなら')」の処理が動きます。

そのため、画面に「さようなら」という文字が表示される結果となります。

クラス内で利用できる変数

Pythonのクラスの中で利用できる変数は大きく2種類に分解できます。

1つが、クラス変数。もう1つが、インスタンス変数です。

クラス変数

クラス変数は、クラス内で定義する変数のことで、全てのインスタンスで共通となる変数です。

クラスの定義文直下に記述することで、クラス変数になります。

class SampleClass:
    a = 'Hello World!'    # クラス変数
    def s_method1(self):
        print(self.a)

ins1 = SampleClass()      # インスタンス1
ins1.s_method2()

ins2 = SampleClass()      # インスタンス2
ins2.s_method2()


# 結果
Hello World!
Hello World!

異なるインスタンス(ins1 / ins2)でも、同じ「Hello World!」として出力されていることが分かります。

インスタンス変数

インスタンス変数は、クラス変数と異なりインスタンスに依存する変数です。つまり、インスタンスごとに異なる値になる変数です。

インスタンス変数は、メソッドの直下で "self" の属性として定義します。

class SampleClass():
    # コンストラクタ
    def __init__(self,aaa):
        self.aaa = aaa           # 引数aaaの値をインスタンス変数の初期値とする

ins1 = SampleClass("Hello!")     # 引数aaaに「Hello!」を渡す
print(ins1.aaa)

ins2 = SampleClass("Good Bye!")  # 引数aaaに「Good Bye!」を渡す
print(ins2.aaa)


# 結果
Hello!
Good BYe!

インスタンス変数は、インスタンスごとに異なる値となっていることが分かります。クラス変数とインスタンス変数の違いは丁寧に理解しておきましょう。

そして最後に「継承」について説明します。

Python:継承

継承とは、他のクラスと同じメソッドとインスタンス変数を持つクラスを定義することです。

既に定義済のクラスの内容を引き継いで新たなクラスを定義するイメージでOK。

構文ルール:継承

class クラス名(継承するクラス名):
    クラスの実装①
    クラスの実装②
    ・・・・

class SampleClass:
    a = 'Hello World!'
    
    def s_method1(self):
        print(self.a)           

class Child(SampleClass):    # 「SampleClass」を継承して「Child」クラスを定義
    pass

ins = Child()                # インスタンス化
ins.s_method1()              # メソッドの呼び出し

# 結果 ⇒ Hello World!

ハイライト行が継承部分です。

「SampleClass」を継承して「Child」クラスを定義しています。「Child」クラス自体は、中身はからっぽにしてあります。

ですが、この「Child」クラスは、「SampleClass」を継承しているため、「SampleClass」のメソッドを備えています。そのため、画面に Hello World! を表示することができているのです。

多重継承

Pythonでは、複数のクラスから継承することも可能です。これを多重継承と呼びます。

構文ルール:多重継承

class クラス名(継承するクラス名1, 継承するクラス名1,・・・ ):
    クラスの実装①
    クラスの実装②
    ・・・・

継承したいクラス名を「,(カンマ)」で区切るだけ。

class SampleClass1:          # クラス1
    a = 'Hello World!'
    
    def s_method1(self):
        print(self.a)           

class SampleClass2:        # クラス2
    b = 'Good Bye!'
    
    def s_method2(self):
        print(self.b) 
        

class Child(SampleClass1,SampleClass2):   # クラス1,2を親としてchildクラスを定義
    pass

ins = Child()
ins.s_method1()
ins.s_method2()


# 結果
Hello World!
Good Bye!

これで、Pythonにおけるクラスの基本は完璧です。

Pythonを1から学習したい方は

Pythonをより実践的に学びたい―。実際にコーディングをしながら学びたい―。独学に限界を感じている―。

そんな方には、無料体験/オンライン完結もあるプログラミングスクールで学ぶのがおすすめです。都度検索しながら知識を補完していくのではなく、1から体系立てて学ぶことで短時間・かつ効率的にスキルハックすることが可能です。

各プログラミングスクールの特徴をまとめた記事をこちらに記載しておきますので、是非ご覧ください。

タイトルとURLをコピーしました