Python歴が浅いので普通にコンストラクタ使ってSingletonになるようにする方法が思いつきませんでした。なのでSingletonオブジェクトの生成をクラスメソッドで行わせるような実装にしました。まあ本家のデザパタ本もそういう設計でしたしね。コードは以下。
#!/usr/bin/env python # -*- coding:utf-8 -*- class Singleton: f=False @classmethod def GetInstance(cls): if(Singleton.f==False): Singleton.f = True Singleton.instance = Singleton(singleton=True) return Singleton.instance else: return Singleton.instance def __init__(self, singleton=False): if(singleton==False): raise Exception,"This class \"Singleton\" is Singleton" else: pass if __name__=="__main__": # Test a=Singleton.GetInstance() b=Singleton.GetInstance() print a==b a.x=1 print b.x b.x = 2 print a.x
Singletonのコンストラクタに隠しパラメータ的なものを導入してコンストラクタによるインスタンスの生成を制御しています。 当然ながら、この仕様ではコンストラクタのsingletonパラメータ、もしくはSingleton.fの存在を知っている人間はSingletonを破ることが可能です。ざっくり書いたのでコードには無駄な部分があると思います。その辺りはそのうち見直すかも、ということで。コンストラクタのsingletonパラメータについてはuuidgenなどを利用してランダム文字列を生成し、バレにくいパラメータ名をつけるなどの工夫はあります。が、根本的な解決にはなりません。よって、あくまで自分用コードとして利用するための実装です。
Pythonにもprivateの概念はある、ということなので少なくともSingleton.fについてはその存在を隠すことが可能です。メンバがpribvateかどうかは命名規則によって決定され、「__(アンダースコア×2)で始まり、かつ__で終わらない名前」だそうです。以下のページは参考URLです。記述は関数についてですが。