クラス_3(Python_23)

この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、クラスのインスタンス変数、インスタンスメソッドについて学びました。

今回はクラスに設定される変数、メソッドについてみていきましょう。

クラス変数

前回ご紹介したインスタンス変数は、インスタンスごとに値を設定できる変数でした。これとは別にクラスごとに固有の値を設定できる変数があります。これを「クラス変数」と呼びます。以下のように記述します。

クラス名.変数名

以下のスクリプトを実行してみましょう。

class ClassTest:
    pass

ClassTest.No = 1

print(ClassTest.No) # 1を返す

クラス変数「No」が設定できました。クラス変数もインスタンス変数と同様に、インスタンス作成後に指定できます。しかしながら実際には、インスタンス作成時に決まったクラス変数を設定して使用することが多いです。この辺はインスタンス変数と同じですね。以下のスクリプトを実行してみましょう。

class ClassTest:
    counter = 0
    def __init__(self):
        ClassTest.counter += 1

print(ClassTest.counter) # 0を返す
c1 = ClassTest()
print(ClassTest.counter) # 1を返す
c2 = ClassTest()
print(ClassTest.counter) # 2を返す

このスクリプトでは、クラスから作成されたインスタンスの数を確認できます。この様にクラス変数を使用すると「異なるインスタンス間でのデータ共有」、「クラス全体の状態を追跡」、「複数のインスタンスが共有する設定や定数の定義」などが実現できます。

クラスメソッド

前回ご紹介したインスタンスメソッドは、作成したオブジェクトに実装する関数を作る仕組みでした。これとは別に、クラス自体にも関数を持たせることができます。これを「クラスメソッド」と呼びます。クラスメソッドは、インスタンスを生成しなくても使えます。クラスメソッドは、以下のように記述します。

class クラス名:
    @classmethod
    def メソッド名(cls[, パラメーターの列挙]):
        #処理

「cls」の記述は省略できません。「@classmethod」は、「デコレーター」と呼ばれるものです。デコレーターは、関数やメソッド、クラスの定義の前に置く(デコレートする)ことで、その性質をカスタマイズできます。

以下のスクリプトはクラスメソッドの使用例です。

class ClassTest:
    counter = 0
    def __init__(self):
        ClassTest.counter += 1

    @classmethod
    def print_counter(cls):
        print(f'インスタンスの数は、{cls.counter}です')

ClassTest.print_counter() # インスタンスの数は、0です
c1 = ClassTest()
ClassTest.print_counter() # インスタンスの数は、1です
c2 = ClassTest()
ClassTest.print_counter() # インスタンスの数は、2です

スタティックメソッド

インスタンスメソッド、クラスメソッドの他に「スタティックメソッド」というものがあります。スタティックメソッドも、インスタンスを生成しなくても使えます。以下のように記述します。

class クラス名:
    @staticmethod
    def メソッド名([パラメーターの列挙]):
        #処理

クラスメソッドと似ていますが、引数には「cls」の記述がありません。また、デコレーターには「@staticmethod」を記述します。

class ClassTest:
    counter = 0
    def __init__(self):
        ClassTest.counter += 1

    @staticmethod
    def print_counter():
        print(f'インスタンスの数は、{ClassTest.counter}です')

ClassTest.print_counter() # インスタンスの数は、0です
c1 = ClassTest()
ClassTest.print_counter() # インスタンスの数は、1です
c2 = ClassTest()
ClassTest.print_counter() # インスタンスの数は、2です

スタティックメソッドは、クラスメソッドと同様にクラスに属しますが、そのクラスに依存しません。つまり、ただの関数とあまり違いはありません。上のスクリプトは、以下のようにも書けます。

class ClassTest:
    counter = 0
    def __init__(self):
        ClassTest.counter += 1

def print_counter():
    print(f'インスタンスの数は、{ClassTest.counter}です')

print_counter() # インスタンスの数は、0です
c1 = ClassTest()
print_counter() # インスタンスの数は、1です
c2 = ClassTest()
print_counter() # インスタンスの数は、2です

スタティックメソッドは、なんらかの都合で関数をクラスに属させたい場合に使用します。

次回は特殊メソッド

いかがでしようか。クラスの仕組みが明らかになりました。次回は特殊メソッドです。オブジェクトの特殊な動作を定義できます。お楽しみに!!

hirocom777.hatenadiary.org

Python再学習のまとめはこちら!!