偉い人「このクラス一度もselfを使って無くない?」
class MyClass:
def __init__(self, value):
self.value = value
def instance_method(self, arg):
return self.value + arg
偉い人「じゃあわざわざインスタンスにしないでも、クラスメソッドやスタティックメソッドにするといいかも」
俺「はえー」
インスタンスとは?
インスタンスとは、クラスを基に生成された具体的なオブジェクトのこと。例えば、「車」というクラスがある場合、特定の「車の実体」(例えば「私の車」)がインスタンスとなる。
内部的には、「これ俺の車なんすよ笑」と言うと、「んじゃ場所とっときますね」とメモリを確保している。
Pythonでは、クラスを呼び出すことでインスタンスが作成される。
class Car:
def __init__(self, brand, model):
self.brand = brand
self.model = model
my_car = Car("Toyota", "Corolla") # my_carはCarクラスのインスタンス
何でもかんでも「これ俺の車なんすよ(笑)」ってやらなくても「あ、はい、車クラスですね。わかりました」というのだけで話が済むことがある。
メンテナンス性とコードの読みやすさが向上する。
具体的には、どこでインスタンス化するか気にしなくていいので、「main.pyでやってたっけ?それともその先だっけ?」みたいな焦りがなくなって結構便利。
とはいえインスタンスにしていても動きはするので、意識していないと難しかったリする。
実装の例
- クラスメソッドにするならこう
class MyClass:
class_variable = 0
@classmethod
def class_method(cls, arg):
cls.class_variable += arg
return cls.class_variable
- スタティックメソッドにするならこう
class MyClass:
@staticmethod
def static_method(arg1, arg2):
return arg1 + arg2
どの手段を使うべきか?
インスタンスメソッド
インスタンス変数やインスタンスの状態にアクセスする必要がある場合。
- 例:ユーザーアカウントクラスなど
class UserAccount:
def __init__(self, username, email):
self.username = username
self.email = email
def display_user_info(self):
return f'Username: {self.username}, Email: {self.email}'
クラスメソッド
クラス自体に関連する操作を行う場合や、クラス変数を操作する必要がある場合。
- 例:設定管理クラスなど
class Config:
_settings = {}
@classmethod
def set_setting(cls, key, value):
cls._settings[key] = value
@classmethod
def get_setting(cls, key):
return cls._settings.get(key, None)
スタティックメソッド
クラスやインスタンスの状態に依存しない汎用的な操作を行う場合。
- 例:計算などをさせるユーティリティクラスなど
class MathUtilities:
@staticmethod
def add(a, b):
return a + b
@staticmethod
def multiply(a, b):
return a * b
この例だと単なる足し算なので嬉しさがわかりづらいが、例えば「消費税計算のためにまず軽減税率が適用される対象かどうかを判別して消費税の計算を……」みたいな「すごい面倒な計算をさせるだけ」って時に便利。
参考