Singletonパターン (4) - メタクラスを使った方法
- Singletonパターン (1)
- Singletonパターン (2) - ぜ〜んぶクラスメソッド
- Singletonパターン (3) - モジュール
- Singletonパターン (4) - メタクラスを使った方法
- Singletonパターン (5) - Borgの方法
クラスはインスタンスの生成装置だと言えます。
そしてクラス定義とは「どんなメソッドを持つか」「メソッドは何を引数にとるか」等の
インスタンスの性質を定義するものです。
しかし、Singletonの「インスタンスが唯一」とは、個々のインスタンスの性質というより、インスタンスの生成器であるクラスの性質であるといえます。
すると、Singletonの実装はクラスの中ではなく、メタクラスの中でした方がかえって自然かもしれません。
次のコードはSingleton pattern - Wikipedia, the free encyclopediaからの引用です。
class Singleton(type): def __init__(cls, name, bases, dict): super(Singleton, cls).__init__(name, bases, dict) cls.instance = None def __call__(cls, *args, **kw): if cls.instance is None: cls.instance = super(Singleton, cls).__call__(*args, **kw) return cls.instance class MyClass(object): __metaclass__ = Singleton print MyClass() print MyClass()
なお、この場合、インスタンスの唯一性は「クラスツリー全体で唯一のインスタンス」ではなく、「各サブクラス毎に唯一のインスタンス」になります。