在軟件設計過程當中,根據需求須要實現singleton單例模型。好比建立數據庫的鏈接實例。下面利用python新式類裏的__new__的靜態方法來實現。java
__new__原型爲object.__new__(cls,[...]),cls是一個類對象。當你調用C(*arg, **kargs)來建立一個類C的實例時。python內部調用是C.__new__(C, *arg, **kargs),而後返回值是類C的實例c。在確認c是C的實例後,python再調用C.__init__(c, *arg, **kargs)來實例化c。python
因此調用一個實例c=C(2),實際執行的代碼爲:數據庫
c = C.__new__(C, 2) if isinstance(c, C): C.__init__(c, 2)
object.__new__建立一個新的,沒有通過初始化的實例。當你重寫__new__方法時,能夠不用使用修飾器@staticmethod指明它是靜態函數。解釋器會自動判斷這個方法爲靜態方法。若是須要從新綁定C.__new__方法時,只要在類的外面執行C.__new__=staticmethod(youfunc)就能夠了。
安全
下面使用__new__來實現Singleton單例模型。函數
class Singleton(object): _singleton = {} def __new__(cls): if not cls._singleton.has_key(cls): cls._singleton[cls] = object.__new__(cls) return cls._singleton[cls]
能夠看出兩個實例是指向同一個內存地址。Singleton全部子類也有這一個特性。只有一個實例對象。若是它的子類定義了__init__方法,那麼必須保證它的__init__ 方法可以安全的同一個實例進行屢次調用。設計