概要
Java, Python等のオブジェクト指向言語を扱っていると避けて通れないのがクラスという概念
今回はスタティックメソッドについてまとめていこうと思います
前回はクラスメソッドについてまとめてました↓
クラスメソッドについてまとめ
そもそもスタティックメソッドとは?
- インスタンス化せずに呼び出しが可能
- 継承後も動作を変更しない場合に使用する: 汎用的な機能に使用する
Pythonでは以下のように実装される
class Sample:
word = "word"
@staticmethod # デコレートする
def say_word() -> None: # 第一引数には何も指定しない
print(Sample.word)
return
# スタティックメソッドの呼び出し
Sample.say_word()
スタティックメソッドとの違いは?
項目名 | スタティックメソッド | クラスメソッド |
---|---|---|
呼び出し方 | クラス名.メソッド名 | クラス名.メソッド名 |
第一引数 | なし | cls(クラス自身) |
参照できるもの | クラス変数 | クラス変数 |
違いは第一引数ぐらいしかなさそうです
では、どのような使い分けができるをユースケースで確認したいと思います
使い分け
どの情報にアクセスするか/使用するかで分けた方が良さそう
import uuid
class Student:
type: str = "生徒"
def __init__(self, school_name: str, name: str):
self.__school_name = school_name
self.__name = name
self.__id = uuid.uuid4()
# インスタンス個数の情報にアクセスするためインスタンスメソッド
def say_id(self):
print(f'{self.__id}')
return
# サブクラスでも同様の処理なのでスタティックメソッド
@staticmethod
def say_height(height: int) -> None:
print(f'私の身長は{height}です')
return
# クラス変数にアクセスするのでクラスメソッド
@classmethod
def say_class_type(cls) -> None:
print(cls.type)
return
if __name__ == '__main__':
john = Student('hoge', 'John')
tom = Student('huga', 'Tom')
tom.say_id()
john.say_id()
tom.say_class_type()
john.say_class_type()
tom.say_height(168)
john.say_height(199)