クラスメソッドを考えて見よう

Pythonにおいて、クラスにおけるクラスメソッドを考えてみましょう。覚えると病みつきになるかもです。


・クラスメソッドとは直接呼び出せるクラスの関数

呼び出せるだけだったら、例えばグローバル変数とか使えばいいじゃないの?とか思う人もいるかも知れません。
例で、

# 変数の定義
global_variable = 0

# 関数の定義
def set_global_variable(value):
    global global_variable
    global_variable = value

def get_global_variable():
    return global_variable

# テスト
print("初期の変数の値:", get_global_variable())  # 変数の初期値を表示
set_global_variable(10)  # 関数を使用して変数を変更
print("変更後の変数の値:", get_global_variable())  # 変更後の変数の値を表示

結果がこれ

まず、メソッドは当然モジュール内ですからあたりまえに直接呼び出せるとして、前もって変数をグローバル化するスクリプトを作ることにより、
別メソッドでも値は変更されたままで見ることが出来ます。

あと、クラスメソッド使わなくてもインスタンス化すればいいじゃね?と思う人もいるかも知れません。


■じゃぁ、なぜインタンスしないか


・理由1メモリの無駄?


インスタンス化するとまず全体の関数が開かれるのでメモリの無駄といえます。
ただ、これも実際の処理が行われてからと動作によるので、そもそもクラスしろメソッドにしろメモリにロードは一度するから大した違いは無いそうです。


・理由2呼び出すと初期化メソッドも呼び出される

インスタンス化をするとクラスにinitメソッドがある場合はそれも呼び出されてしまいます。

・理由3クラスで管理できる

これがおそらくいちばんのクラスの目的なんではと思います。

クラスの目的がありそれに凖じた関数という理解かと。

普通簡単に考えるとモジュール内にメソッドを書けばどこのクラスでも直接呼び出しでできるのでこっちのほうが簡単といえば簡単だと思います。
クラス内でも使用できるし、クラス外でも単独で呼び出しできるという言い方が正しいかもしれません。

・理由4クラスの変数を単独で変更管理できる

例がこれです

class MyClass:
    class_variable = 0

    @classmethod
    def set_class_variable(cls, value):
        cls.class_variable = value

    @classmethod
    def get_class_variable(cls):
        return cls.class_variable

# テスト
print("初期のクラス変数の値:", MyClass.get_class_variable())  # クラス変数の初期値を表示
MyClass.set_class_variable(10)  # クラスメソッドを使用してクラス変数を変更
print("変更後のクラス変数の値:", MyClass.get_class_variable())  # 変更後のクラス変数の値を表示


class_variableはクラスの変数ですが、get_class_variable関数を直接呼び出して変数を変更してます。



ちゃんと変更されますね。

・理由5継承すればいいのでは?

と思った人もいるかもですが、継承するとまず初期化メソッド(init)も被ったりするので、意外に使い勝手悪いです。
本当に合体程度に継承は思ったほうがいいかも。

■クラスの探求は深い…

・間違ったことも書いてるかも。(嘆き)



今後ともクラスの探求は続く…

個人的にはVSCODE長文書く際は必要だと思うので、覚えたほうがいいと思う。

NOTEでいうと、大見出しみたいなもの?(ツッコミ待ち)