【Python】レッスン5-07:静的メソッドを理解しよう

一つ前のLessonではメソッドのオーバーライドについて学習しました。
今回は静的メソッドについて見ていきましょう。
Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:関数とスコープ編
Lesson4:データ構造編
Lesson5:オブジェクト指向編
・Lesson5-1:クラスの基本を理解しよう
・Lesson5-2:メソッドの基本を理解しよう
・Lesson5-3:カプセル化を理解しよう
・Lesson5-4:プロパティを理解しよう
・Lesson5-5:クラスの継承を理解しよう
・Lesson5-6:メソッドのオーバーライドを理解しよう
・Lesson5-7:静的メソッドを理解しよう ◁今回はココ
・Lesson5-8:モジュールを使いこなそう
・Lesson5-9:抽象クラスを理解しよう
・Lesson5-10:ミックスインを理解しよう
・Lesson5-11:データクラスを理解しよう
・練習問題5-1:モンスター捕獲ゲームを作ろう
・練習問題5-2:モンスターとのバトルゲームを作ろう
次のステップ:Python基礎習得者にお勧めの道5選(実務or副業)
静的メソッド入門|インスタンス不要の処理をクラス配下に
インスタンスやクラスの状態に依存しない処理を、クラス配下にまとめて扱えるのが「静的メソッド(@staticmethod)」です。
詳しい書き方や注意点は本文で解説しますが、要はインスタンスを作らずに呼び出せる共通ロジックの置き場だと考えてください。
この知識を身につけると、散らばりがちなユーティリティ関数を整理でき、呼び出しが簡潔になり、設計とテストの見通しが良くなるという実用的なメリットを得られます。
それでは、要点→コード例→練習問題の順で、静的メソッドを実務レベルで使いこなす感覚を掴んでいきましょう。本文へ進んで手を動かしてください。
静的メソッドとは|概要と基本構文
静的メソッド はPythonのクラス内で定義されるメソッドの一種ですが、通常のインスタンスメソッドとは異なり、インスタンスやクラス自体に依存しません。
つまりクラスやそのインスタンスがなくても呼び出すことができます。
これは @staticmethod
というデコレータを使って定義され、主にクラスの外部からアクセスできる汎用的な処理を提供するために使われます。
また、静的メソッドは通常のメソッドと違ってself
やcls
といった引数を取ることはありません。
これは、そのメソッドがクラスの状態に依存せず、固定的な処理を行うためです。
以下は静的メソッドの定義方法の例です。
class Calculator: # Calculatorクラスの定義 @staticmethod # 静的メソッドであることを表すデコレーター def add(x, y): # 静的メソッドの定義 return x + y # 静的メソッドの呼び出し(インスタンス生成不要) result = Calculator.add(5, 3) # クラス名.メソッド名で呼び出し print(result) # 出力:8
この例ではadd
メソッドが静的メソッドとして定義されており、Calculator
クラスから直接呼び出しています。
通常のインスタンスメソッドのように、インスタンスを作成する必要がなく、シンプルに呼び出すことができます。
静的メソッドの使用コード例
静的メソッドはクラスの状態に依存しないため、どのインスタンスでも共通に使用できるユーティリティ関数を提供するのに適しています。
たとえば数値の処理や文字列のフォーマット、日付の操作など、クラス全体に関連する処理をカプセル化するために使われます。
class MathUtility: # MathUtilityクラスの定義 @staticmethod # 静的メソッドであることを表すデコレーター def multiply(x, y): # 静的メソッドmultiplyの定義 return x * y @staticmethod # 静的メソッドであることを表すデコレーター def square(number): # 静的メソッドsquarの定義 return number ** 2 # インスタンス化せずにメソッド呼出し result1 = MathUtility.multiply(10, 5) result2 = MathUtility.square(7) print(result1) # 出力:50 print(result2) # 出力:49
この例ではmultiply
メソッドとsquare
メソッドがそれぞれ数値の掛け算と平方計算を行うための静的メソッドとして定義されています。
どちらもクラスに属するものの、インスタンスとは無関係に利用できる点が特徴です。
まとめ|状態に依存しない処理をクラスに整理しよう
本記事では、インスタンスやクラスの状態に依存しない処理を、@staticmethod でクラス配下にまとめる方法を学びました。
self
や cls
を受け取らない関数をクラスに所属させることで、名前空間を整理し、依存を減らし、テストしやすい構造にできます。
小さな関数でも構いません。まずは既存コードの「状態に触れていない処理」を静的メソッドに移してみるところから始めて、設計の見通しが良くなる感覚をつかんでいきましょう。
- サイト改善アンケート|ご意見をお聞かせください(1分で終わります)
-
本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの「プログラミングを学習する理由」などをアンケート形式でお伺いしています。1分だけ、ご協力いただけますと幸いです。
【Python】サイト改善アンケート
練習問題:静的メソッドを使ってみよう
この記事で学習した「静的メソッド」を復習する練習問題に挑戦しましょう。
問題|図書管理プログラムを作成しよう
本の情報を扱うクラスを題材に、インスタンスメソッドと静的メソッドの役割分担を確認するミニプログラムを作成します。
書誌情報を整形して表示する処理はインスタンスメソッドに、出版年の妥当性チェックは静的メソッドに任せ、必要に応じてチェック結果を利用して本の生成と表示を行ってください。
以下の要件に従ってコードを完成させてください。
Book
クラスを定義し、コンストラクタで属性title
,author
,year
を保持する。- インスタンスメソッド
info(self)
を定義し、「タイトル、出版年、著者」 を出力する。 - 静的メソッド
is_valid_year(year)
を定義し、int
型かつyear > 0
のときにTrue
を返す簡易チェックを行う。 - 実行例として次を行う:
- 静的メソッドを使用し、出版年を2020年、-150年として結果を出力する。
- インスタンス生成「タイトル:吾輩は猫である、著者、夏目漱石、出版年: 1905」し、インスタンスメソッドで出力する。
- 静的メソッドを使用し「タイトル:未来図書、著者、AI研究者、出版年: 2025」を追加して出力する。
ただし、以下のような実行結果となるコードを書くこと。
True False 『吾輩は猫である』 (1905) - 夏目漱石 『未来図書』 (2025) - AI研究者
ヒント|難しいと感じる人だけ見よう
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント1【コードの構成を見る】
-
正解のコードは上から順に以下のような構成となっています。
1:書誌情報を保持し、整形済みの紹介文を返すための土台を作る
・受け取ったタイトル・著者・出版年を、そのままインスタンスの属性として保持する
・表示用の文章はメソッドの中で組み立て、文字列として返す(その場で表示しない)
・書式は「『タイトル』 (出版年) – 著者」を意識して組み立てる
2:インスタンスに依存しない「出版年の妥当性チェック」を用意する
・状態を参照しないため、自己参照やクラス参照の引数は受け取らない
・年が整数型かどうか、そして 0 より大きいかを順に判定する
・画面表示は行わず、判定結果を真偽値で返す3:静的メソッドをクラス名から呼び出し、妥当な年と不正な年の結果を確認する
・静的メソッドはクラス名から直接呼び出す
・返り値(真偽値)をそのまま出力して挙動を確認する
・妥当な例と不正な例を対にしてテストすると理解が早い4:妥当な年で本のインスタンスを作り、紹介文を表示する
・タイトル・著者・出版年の3つを渡して本のインスタンスを作る
・紹介文はインスタンスメソッドで文字列として受け取り、呼び出し側で表示する
・出版年は正の整数であることを前提に扱う(静的メソッドのチェックと整合)5:静的メソッドで妥当性を判定し、条件分岐で本の追加・表示を切り替える
・判定関数はクラス名から直接呼び出し、真なら生成・偽なら中止の流れにする
・インスタンス生成後は、紹介文を返すメソッドの戻り値を表示する
・不正な場合のユーザー向けメッセージも忘れずに用意する
- ヒント2【穴埋め問題にする】
-
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
class Book: def __init__(self, title, author, year): self.title = title self.author = author self.year = year # インスタンスメソッド def info(self): return f"『{self.title}』 ({self.year}) - {self.author}" # 静的メソッド @'''(穴埋め)''' def '''(穴埋め)'''(year): # 年が 0 より大きいかどうかをチェック return isinstance(year, int) and year > 0 # ===== 実行例 ===== print(Book.'''(穴埋め)'''(2020)) # True print('''(穴埋め)'''.is_valid_year(-150)) # False # 正しい年で作成 book1 = Book("吾輩は猫である", "夏目漱石", 1905) print(book1.info()) # 『吾輩は猫である』 (1905) - 夏目漱石 # 静的メソッドで確認してから本を追加 year = 2025 ''' 静的メソッドをクラス名から呼び出して year を妥当性チェックする if 文を書く ''' book2 = Book("未来図書", "AI研究者", year) print(book2.info()) else: print("無効な出版年です。")
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
解答例|出版年チェック付き図書クラスプログラム
例えば以下のようなプログラムが考えられます。
- 正解コード
-
class Book: def __init__(self, title, author, year): self.title = title self.author = author self.year = year # インスタンスメソッド def info(self): return f"『{self.title}』 ({self.year}) - {self.author}" # 静的メソッド @staticmethod def is_valid_year(year): # 年が 0 より大きいかどうかをチェック return isinstance(year, int) and year > 0 # ===== 実行例 ===== print(Book.is_valid_year(2020)) # True print(Book.is_valid_year(-150)) # False # 正しい年で作成 book1 = Book("吾輩は猫である", "夏目漱石", 1905) print(book1.info()) # 『吾輩は猫である』 (1905) - 夏目漱石 # 静的メソッドで確認してから本を追加 year = 2025 if Book.is_valid_year(year): book2 = Book("未来図書", "AI研究者", year) print(book2.info()) else: print("無効な出版年です。")
解答例の解説|出版年チェック付き図書クラスプログラムの考え方
解答例の詳細解説は以下の通りです。
- 詳細解説
-
クラスの定義
class Book: def __init__(self, title, author, year): self.title = title self.author = author self.year = year # インスタンスメソッド def info(self): return f"『{self.title}』 ({self.year}) - {self.author}"
本を表すための設計図を用意し、タイトル・著者・出版年という基本情報をインスタンスの中に保存しています。
あわせて、保存した情報から人が読みやすい紹介文を組み立てて返す機能も用意します。
ここでのポイントは、画面表示そのものは行わず、紹介文を文字列として返す設計にしていることです。
これにより、どこで表示するかは呼び出し側が自由に決められ、テストや再利用がしやすくなります。静的メソッドの定義
# 静的メソッド @staticmethod def is_valid_year(year): # 年が 0 より大きいかどうかをチェック return isinstance(year, int) and year > 0
この部分は、オブジェクトの状態に関係なく使える判定処理をクラスに紐づけておくための仕組みです。
年の値が正しい形式かどうかだけを調べる、小さなユーティリティとして働きます。
具体的には、年が数値として扱える型であり、かつ 0 より大きいかを確認し、その結果を真偽値で返します。
インスタンスを作る前に入力値をふるいにかけられるため、後続の処理を安全に進めやすくなります。静的メソッドの呼び出し
# ===== 実行例 ===== print(Book.is_valid_year(2020)) # True print(Book.is_valid_year(-150)) # False
ここでは、インスタンスを作らずにクラスにぶら下がっている判定用の関数を直接使い、想定どおりに真偽が返るかを確かめています。
妥当な出版年の例と、不正な出版年の例を用意して結果を比べることで、判定条件が正しく働いていることを目で確認できます。
返ってきた値はそのまま表示し、後続の分岐やデータ作成に使う準備段階として扱います。インスタンスを生成と紹介文表示
# 正しい年で作成 book1 = Book("吾輩は猫である", "夏目漱石", 1905) print(book1.info()) # 『吾輩は猫である』 (1905) - 夏目漱石
ここでは、チェック済みの出版年を使って本のオブジェクトを実際に作成し、その本が持つ情報を読みやすい文章として取り出して表示します。
インスタンスの生成でタイトル・著者・出版年を内部に格納し、紹介文はインスタンスメソッドが組み立てた文字列を返すので、呼び出し側はそれを表示するだけで済みます。
判定(妥当性チェック)と表示(ユーザー向けの出力)を分けることで、コードの見通しと再利用性が高まります。条件分岐で本の追加
# 静的メソッドで確認してから本を追加 year = 2025 if Book.is_valid_year(year): book2 = Book("未来図書", "AI研究者", year) print(book2.info()) else: print("無効な出版年です。")
ここでは、入力された出版年が正しいかどうかを先に判定し、結果に応じて処理を分けています。
判定はクラスに属する静的メソッドが行い、真偽値を返します。
妥当であれば本のインスタンスを生成して紹介文を表示し、不正ならユーザーに分かるメッセージを出します。
判定と生成・表示を段階的に分離することで、コードの意図が明確になり、将来のルール変更にも対応しやすくなります。
静的メソッドの疑問解消|FAQと用語のまとめ
初心者がつまずきやすいポイントをFAQとしてまとめ、またよく使う専門用語をわかりやすく整理しました。
理解を深めたいときや、ふと疑問に感じたときに役立ててください。
FAQ|静的メソッドに関するよくある質問
- Q1. 静的メソッドと通常メソッドの違いは?
-
静的メソッドはインスタンスを生成せずにクラスから直接呼び出せるメソッドで、通常のメソッドはインスタンスが必要です。
- Q2. どんな時に静的メソッドを使うべきですか?
-
インスタンスの状態に依存しない処理(例:単純な計算やユーティリティ関数)に使うのが効果的です。
- Q3. 静的メソッドは継承されますか?
-
はい、子クラスに継承されます。ただし、必要に応じて子クラス側で上書きも可能です。
Python用語集|静的メソッドに関する用語一覧
今回の記事で出てきた用語・関数などを一覧で紹介します。
このサイトに出てくる 全てのPython用語をまとめた用語集 も活用してください。