Pythonのシングルトンクラスの作り方!初心者向けデザインパターン入門
生徒
「Pythonで同じ設定クラスを何度も作ってしまうんですが、ひとつだけにできませんか?」
先生
「それならシングルトンという考え方が役に立ちます。常に一つだけ存在するクラスを作る方法です。」
生徒
「クラスなのに一つしか作れないって、どういう仕組みなんですか?」
先生
「Pythonの仕組みを少し工夫すると実現できます。順番に見ていきましょう。」
1. シングルトンとは何か
シングルトンとは「必ず一つしか存在しない」ことを保証する設計の考え方です。このような考え方をまとめたものを「デザインパターン」と呼びます。デザインパターンとは、よくある設計の悩みを解決するための定番の形です。
例えるなら、家の中にある電気のブレーカーのようなものです。部屋ごとに勝手に増えると困りますが、一つだけあれば全体を管理できます。設定情報やログ管理など、全体で共有したいものにシングルトンは向いています。
2. 普通のクラスとの違い
Pythonでクラスを作ると、通常は何個でも新しいインスタンスを作れます。インスタンスとは、クラスから生まれた実体のことです。同じ設計図から作った別々の箱のようなものと考えると分かりやすいです。
しかし、シングルトンでは箱は一つだけです。何度作ろうとしても、同じ箱が返ってくる仕組みになっています。
3. Pythonで一番シンプルなシングルトンの作り方
初心者向けに分かりやすい方法として、「クラス変数」を使うやり方があります。クラス変数とは、クラス全体で共有される変数です。
class AppConfig:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
config1 = AppConfig()
config2 = AppConfig()
print(config1 is config2)
True
この例では、最初に作られた一つのインスタンスだけが保存され、二回目以降は同じものが返されます。「is」は同じものかどうかを確認するための比較です。
4. __new__メソッドの役割
__new__は、インスタンスが作られる直前に呼ばれる特別なメソッドです。まだ箱が作られていない段階で動きます。そのため、「すでに箱があるか」を確認するのに適しています。
難しく感じる場合は、「インスタンスを作る入口を見張っている場所」くらいのイメージで大丈夫です。
5. シングルトンが使われる場面
シングルトンは、設定情報、ログ出力、アプリ全体の状態管理などでよく使われます。どこからアクセスしても同じ状態を参照できるため、データのずれを防げます。
一方で、何でもシングルトンにすると仕組みが分かりにくくなることもあります。必要な場面だけで使うことが大切です。
6. 初心者がつまずきやすいポイント
シングルトンは便利ですが、「クラスなのに一つだけ」という考え方が最初は混乱しやすいです。無理に覚えようとせず、「全体で共有する特別な箱」と考えると理解しやすくなります。
Pythonのオブジェクト指向プログラミングでは、このような設計の工夫がコードの分かりやすさにつながります。