カテゴリ: Python 更新日: 2026/03/03

Pythonのシングルトンクラスの作り方を完全解説!初心者でもわかるデザインパターン入門

Pythonのシングルトンクラスの作り方(デザインパターン解説)
Pythonのシングルトンクラスの作り方(デザインパターン解説)

先生と生徒の会話形式で理解しよう

生徒

「Pythonで作ったクラスって、何個でも作れてしまいますよね?1個だけに制限する方法はあるんですか?」

先生

「あります。そういうときに使われるのがシングルトンという考え方です。クラスのインスタンスを必ず1つだけにする仕組みですね。」

生徒

「なぜ1つだけにしたいんですか?」

先生

「設定情報やログ管理のように、全体で共通のものは1つだけあれば十分だからです。では、Pythonでの作り方を順番に見ていきましょう。」

-

1. シングルトンクラスとは何か

1. シングルトンクラスとは何か
1. シングルトンクラスとは何か

シングルトンクラスとは、プログラムの中でインスタンスが必ず1つだけ存在するように制御されたクラスのことです。インスタンスとは、クラスをもとにして作られた実体のことを指します。

初心者の方は、クラスを「設計図」、インスタンスを「その設計図から作った実物」と考えるとわかりやすいです。通常は設計図から何個でも実物を作れますが、シングルトンでは「この設計図からは1個しか作れない」という制限をかけます。

この考え方はデザインパターンと呼ばれる、よく使われる設計の型の一つです。デザインパターンは、よくある問題に対する定番の解決方法をまとめたものです。

2. なぜシングルトンが必要なのか

2. なぜシングルトンが必要なのか
2. なぜシングルトンが必要なのか

シングルトンが使われる理由は、「全体で同じ状態を共有したい」場面が多いからです。たとえばアプリ全体の設定情報、ログの出力先、データベースへの接続管理などは、何個も存在すると混乱の元になります。

もし設定クラスが複数作られてしまうと、ある場所で変更した設定が別の場所に反映されないという問題が起こります。シングルトンにしておけば、どこから使っても必ず同じ1つのインスタンスを参照するため、状態がズレません。

初心者の段階では少し難しく感じますが、「みんなで共有する箱は1つにする」と覚えておくと理解しやすいです。

3. 通常のクラスでは何が問題になるのか

3. 通常のクラスでは何が問題になるのか
3. 通常のクラスでは何が問題になるのか

まずは、普通のクラスがどのように動くのかを確認してみましょう。何も工夫しない場合、クラスからはいくつでもインスタンスを作ることができます。


class Sample:
    pass

a = Sample()
b = Sample()

print(a is b)

False

この結果は、aとbが別々のインスタンスであることを意味しています。設定管理などでこれが起きると、意図しない動作につながります。そのため、インスタンス生成を制御する必要があります。

4. __new__メソッドを使った基本的なシングルトン

4. __new__メソッドを使った基本的なシングルトン
4. __new__メソッドを使った基本的なシングルトン

Pythonでは、__new__という特別なメソッドを使うことで、インスタンスの生成そのものを制御できます。__new__は、インスタンスが作られる直前に呼ばれるメソッドです。

ここで「すでにインスタンスがあればそれを返す」という処理を書けば、シングルトンを実現できます。


class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

a = Singleton()
b = Singleton()

print(a is b)

True

このように、常に同じインスタンスが返されるため、aとbは同一の存在になります。これがシングルトンクラスの基本形です。

-

5. 初期化処理で気をつけるポイント

5. 初期化処理で気をつけるポイント
5. 初期化処理で気をつけるポイント

シングルトンでは、__init__の扱いに注意が必要です。__init__はインスタンス生成時だけでなく、呼び出すたびに実行されるため、毎回初期化してしまう可能性があります。

そのため、初期化は一度だけ行うようにフラグを使うのが一般的です。


class Config:
    _instance = None
    _initialized = False

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

    def __init__(self):
        if not self._initialized:
            self.setting = "default"
            self._initialized = True

config1 = Config()
config2 = Config()

print(config1.setting)
print(config1 is config2)

default
True

このようにすることで、初期化処理が一度だけ実行され、安全にシングルトンを利用できます。

6. モジュールを使ったシンプルなシングルトン

6. モジュールを使ったシンプルなシングルトン
6. モジュールを使ったシンプルなシングルトン

Pythonでは、モジュール自体が一度しか読み込まれないという特徴があります。この性質を利用すると、クラスを使わなくてもシングルトンのような動きを実現できます。

初心者にとっては、こちらの方が理解しやすい場合もあります。


# settings.py
value = 10

# main.py
import settings

print(settings.value)

同じモジュールを何度importしても、中身は共有されます。そのため、設定管理用途ではよく使われる方法です。

7. シングルトンを使うときの注意点

7. シングルトンを使うときの注意点
7. シングルトンを使うときの注意点

シングルトンは便利ですが、使いすぎるとプログラムの構造が分かりにくくなります。どこからでも同じインスタンスを触れるため、変更の影響範囲が広がりやすいからです。

また、テストが難しくなるという欠点もあります。状態が共有されるため、テスト同士が影響し合う可能性があります。

そのため、「本当に1つである必要があるか」を考えたうえで使うことが大切です。

8. 初心者が理解するための身近な例え

8. 初心者が理解するための身近な例え
8. 初心者が理解するための身近な例え

シングルトンは「家の中のリモコン」に例えられます。テレビは1台なのに、リモコンが何個もあると混乱しますよね。チャンネルが合わなくなったり、音量が変わったりします。

リモコンを1つにして、家族全員がそれを使えば、常に同じ状態を操作できます。シングルトンも同じで、プログラム全体で1つの存在を共有する仕組みなのです。

コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

関連記事:
カテゴリの一覧へ
新着記事
New1
Python
Pythonのシングルトンクラスの作り方を完全解説!初心者でもわかるデザインパターン入門
New2
Python
Pythonで文字列が数値か判定する方法!isdigit()・isnumeric()の違い
New3
Python
Pythonで辞書のネスト構造(入れ子辞書)を扱う方法 初心者向け完全ガイド
New4
PHP
PHPのforeachループを完全ガイド!初心者でもわかる配列・連想配列の処理
-
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonの書き方を基本から解説!はじめてのPythonプログラム
No.2
Java&Spring記事人気No2
Python
Pythonのダックタイピングとは?型チェックなしで動的に振る舞うOOP設計をやさしく解説
No.3
Java&Spring記事人気No3
PHP
PHP の可変変数と変数の参照渡しを完全解説!初心者でも理解できる動的変数の使い方
No.4
Java&Spring記事人気No4
Python
Pythonで経過時間を計測する方法を完全解説!初心者でもわかる time.perf_counter() と time.sleep()
No.5
Java&Spring記事人気No5
Python
Pythonのセット(set)とは?リストや辞書との違いを解説
No.6
Java&Spring記事人気No6
Python
Pythonで一時ファイルを作成・管理する方法!初心者でもわかるtempfileモジュール入門
No.7
Java&Spring記事人気No7
PHP
PHPのJWT認証を完全ガイド!初心者でもわかるJSON Web Tokenの基本と安全な仕組み
No.8
Java&Spring記事人気No8
PHP
PHPのXSS対策を完全ガイド!初心者でもわかる安全なWebアプリの作り方
-
-