Singletonパターン (4) - メタクラスを使った方法


クラスはインスタンスの生成装置だと言えます。

そしてクラス定義とは「どんなメソッドを持つか」「メソッドは何を引数にとるか」等の
インスタンスの性質を定義するものです。

しかし、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()

なお、この場合、インスタンスの唯一性は「クラスツリー全体で唯一のインスタンス」ではなく、「各サブクラス毎に唯一のインスタンス」になります。