這篇文章給大家分享的是有關(guān)Python中__init__和__new__方法有什么用的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供臥龍企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計、成都做網(wǎng)站、H5建站、小程序制作等業(yè)務(wù)。10年已為臥龍眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。__ init __方法
init方法負責對象的初始化,系統(tǒng)執(zhí)行該方法前,其實該對象已經(jīng)存在了,要不然初始化什么東西呢?先看例子:
# 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): # 可以定義任意參數(shù) print('__call__ ') A()
輸出
__new__ __init__
小編推薦一個學python的學習qun 740,3222,34
無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學習!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!
從輸出結(jié)果來看, new方法先被調(diào)用,返回一個實例對象,接著 init 被調(diào)用。 call方法并沒有被調(diào)用,這個我們放到最后說,先來說說前面兩個方法,稍微改寫成:
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>
從輸出結(jié)果來看,new 方法的返回值就是類的實例對象,這個實例對象會傳遞給 init 方法中定義的 self 參數(shù),以便實例對象可以被正確地初始化。
如果 new 方法不返回值(或者說返回 None)那么 init 將不會得到調(diào)用,這個也說得通,因為實例對象都沒創(chuàng)建出來,調(diào)用 init 也沒什么意義,此外,Python 還規(guī)定,init 只能返回 None 值,否則報錯,這個留給大家去試。
__ init __方法可以用來做一些初始化工作,比如給實例對象的狀態(tài)進行初始化:
def __init__(self, a, b): self.a = a self.b = b super(A, self).__init__()
另外,__ init __方法中除了self之外定義的參數(shù),都將與new方法中除cls參數(shù)之外的參數(shù)是必須保持一致或者等效。
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 __ 方法
一般我們不會去重寫該方法,除非你確切知道怎么做,什么時候你會去關(guān)心它呢,它作為構(gòu)造函數(shù)用于創(chuàng)建對象,是一個工廠函數(shù),專用于生產(chǎn)實例對象。著名的設(shè)計模式之一,單例模式,就可以通過此方法來實現(xiàn)。在自己寫框架級的代碼時,可能你會用到它,我們也可以從開源代碼中找到它的應(yīng)用場景,例如微型 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 方法是實現(xiàn)單例模式的的一種方式,如果實例對象存在了就直接返回該實例即可,如果還沒有,那么就先創(chuàng)建一個實例,再返回。當然,實現(xiàn)單例模式的方法不只一種,Python之禪有說:
There should be one-- and preferably only one --obvious way to do it.
用一種方法,最好是只有一種方法來做一件事
感謝各位的閱讀!關(guān)于“Python中__init__和__new__方法有什么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!