您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Python中__init__和__new__方法有什么用的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
__ init __方法
init方法負責對象的初始化,系統執行該方法前,其實該對象已經存在了,要不然初始化什么東西呢?先看例子:
# class A(object): python2 必須顯示地繼承objectclass A: def __init__(self): print("__init__ ") super(A, self).__init__() def __new__(cls): print("__new__ ") return super(A, cls).__new__(cls) def __call__(self): # 可以定義任意參數 print('__call__ ') A()
輸出
__new__ __init__
小編推薦一個學python的學習qun 740,3222,34
無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多干貨和技術資料分享!
從輸出結果來看, new方法先被調用,返回一個實例對象,接著 init 被調用。 call方法并沒有被調用,這個我們放到最后說,先來說說前面兩個方法,稍微改寫成:
def __init__(self): print("__init__ ") print(self) super(A, self).__init__()def __new__(cls): print("__new__ ") self = super(A, cls).__new__(cls) print(self) return self
輸出:
__new__ <__main__.A object at 0x1007a95f8>__init__ <__main__.A object at 0x1007a95f8>
從輸出結果來看,new 方法的返回值就是類的實例對象,這個實例對象會傳遞給 init 方法中定義的 self 參數,以便實例對象可以被正確地初始化。
如果 new 方法不返回值(或者說返回 None)那么 init 將不會得到調用,這個也說得通,因為實例對象都沒創建出來,調用 init 也沒什么意義,此外,Python 還規定,init 只能返回 None 值,否則報錯,這個留給大家去試。
__ init __方法可以用來做一些初始化工作,比如給實例對象的狀態進行初始化:
def __init__(self, a, b): self.a = a self.b = b super(A, self).__init__()
另外,__ init __方法中除了self之外定義的參數,都將與new方法中除cls參數之外的參數是必須保持一致或者等效。
class B: def __init__(self, *args, **kwargs): print("init", args, kwargs) def __new__(cls, *args, **kwargs): print("new", args, kwargs) return super().__new__(cls) B(1, 2, 3)# 輸出new (1, 2, 3) {} init (1, 2, 3) {}
__ new __ 方法
一般我們不會去重寫該方法,除非你確切知道怎么做,什么時候你會去關心它呢,它作為構造函數用于創建對象,是一個工廠函數,專用于生產實例對象。著名的設計模式之一,單例模式,就可以通過此方法來實現。在自己寫框架級的代碼時,可能你會用到它,我們也可以從開源代碼中找到它的應用場景,例如微型 Web 框架 Bootle 就用到了。
class BaseController(object): _singleton = None def __new__(cls, *a, **k): if not cls._singleton: cls._singleton = object.__new__(cls, *a, **k) return cls._singleton
這段代碼出自 https://github.com/bottlepy/bottle/blob/release-0.6/bottle.py
這就是通過 new 方法是實現單例模式的的一種方式,如果實例對象存在了就直接返回該實例即可,如果還沒有,那么就先創建一個實例,再返回。當然,實現單例模式的方法不只一種,Python之禪有說:
There should be one-- and preferably only one --obvious way to do it.
用一種方法,最好是只有一種方法來做一件事
感謝各位的閱讀!關于“Python中__init__和__new__方法有什么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。