Singletonパターン (2) - ぜ〜んぶクラスメソッド


Pythonにはクラスメソッドがあります。クラスメソッドは、どのインスタンスから呼び出しても同じ結果になります。

では、もし全部のメソッドをクラスメソッドにしてしまえば、
インスタンス間の区別がなくなります。
つまり、インスタンスが1個しかないのと同じです。

#ぜ〜んぶクラスメソッド
class Singleton(object):
    @classmethod
    def set_name(cls, name):
        cls.name = name
    
    @classmethod
    def get_name(cls):
        return cls.name
    
class Example(Singleton):
    @classmethod
    def set_name(cls, name):
        cls.name = name*2

a = Singleton()
b = Singleton()
c = Example()
a.set_name("foo")
b.set_name("bar")
c.set_name("2000")

print a, a.get_name() #=> <__main__.Singleton object at 0x00B01550> bar
print b, b.get_name() #=> <__main__.Singleton object at 0x00B01570> bar
print c, c.get_name() #=> <__main__.Example object at 0x00B01590> 20002000


これで、サブクラスを作る事も!

・・・できる事はできるのですが、意味があるのか疑問です。

Example.set_nameでは、基底クラスのSingleton.set_nameを利用する事は出来ません。

Singleton.set_nameを呼び出しても、Exampleには何の変化も無いからです。そのため、継承の効能が半減します。

また、シングルトンではない既存のクラス(マルチトン?)を、シングルトンに変更するのも手間です。