__new__靜態方法
新式類都有一個__new__的靜態方法,它的原型是object.__new__(cls[, ...])
cls是一個類對象,當你調用C(*args, **kargs)來建立一個類C的實例時,python的內部調用是
C.__new__(C, *args, **kargs),而後返回值是類C的實例c,在確認
c是C的實例後,python再調用C.__init__(c, *args, **kargs)來初始化實例c。
因此調用一個實例c = C(2),實際執行的代碼爲:
c = C.__new__(C, 2)
if
isinstance(c, C):
C.
__init__(c, 23)#__init__第一個參數要爲實例對象
object.__new__()建立的是一個新的,沒有通過初始化的實例。當你重寫__new__方法時,能夠不
用使用裝飾符@staticmethod指明它是靜態函數,解釋器會自動判斷這個方法爲靜態方法。若是
須要從新綁定C.__new__方法時,只要在類外面執行C.__new__ = staticmethod(yourfunc)就能夠了。
能夠使用__new__來實現Singleton單例模式:
class Singleton(object):
_singletons = {}
def __new__(cls):
if
not cls._singletons.get(cls): #若尚未任何實例
cls._singletons[cls] = object.__new__(cls) #生成一個實例
return cls._singletons[cls] #返回這個實例
運行結果以下:
使用id()操做,能夠看到兩個實例指向同一個內存地址。Singleton的全部子類也有這一
特性,只有一個實例對象,若是它的子類定義了__init__()方法,那麼必須保證它的
__init__方法可以安全的同一個實例進行屢次調用。