Singletonパターン (2) - ぜ〜んぶクラスメソッド
- Singletonパターン (1)
- Singletonパターン (2) - ぜ〜んぶクラスメソッド
- Singletonパターン (3) - モジュール
- Singletonパターン (4) - メタクラスを使った方法
- Singletonパターン (5) - Borgの方法
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には何の変化も無いからです。そのため、継承の効能が半減します。
また、シングルトンではない既存のクラス(マルチトン?)を、シングルトンに変更するのも手間です。