__new__靜態方法

 __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__方法可以安全的同一個實例進行屢次調用。
 
相關文章
相關標籤/搜索