_new_方法
class Singleton(object):
def __new__(cls, *args, **kw):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kw)
return cls._instance
class MyClass(Singleton):
a = 1
這個方法,把類的實例和一個類變量_instance關(guān)聯(lián)起來了,這樣可以控制該類只有一個實例.
共享屬性
創(chuàng)建實例時把所有實例的dict指向同一個字典,這樣它們具有相同的屬性和方法.
class Borg(object):
_state = {}
def __new__(cls, *args, **kw):
ob = super(Borg, cls).__new__(cls, *args, **kw)
ob.__dict__ = cls._state
return ob
class MyClass2(Borg):
a = 1
裝飾器實現(xiàn)
def singleton(cls):
instances = {}
def getinstance(*args, **kw):
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return getinstance
@singleton
class MyClass:
...
在上面,我們定義了一個裝飾器 singleton氛琢,它返回了一個內(nèi)部函數(shù) getinstance且改,該函數(shù)會判斷某個類是否在字典 instances 中茅主,如果不存在,則會將 cls 作為 key捂敌,cls(*args, **kw) 作為 value 存到 instances 中获讳,否則,直接返回 instances[cls]英妓。
import方法
作為python的模塊是天然的單例模式
# mysingleton.py
class My_Singleton(object):
def foo(self):
pass
my_singleton = My_Singleton()
# to use
from mysingleton import my_singleton
my_singleton.foo()
本文轉(zhuǎn)自http://python.jobbole.com/87294/
記錄于此方便日后查閱