通俗講解python new

2022-05-15 01:19:08 字數 1738 閱讀 2503

目錄**於別人的部落格

曾經我幼稚的以為認識了python的__init__()方法就相當於認識了類構造器,結果,new()方法突然出現在我眼前,讓我突然認識到原來__new__才是老大。為什麼這麼說呢?

​ 我們首先得從__new__(cls[,...])的引數說說起,__new__方法的第乙個引數是這個類,而其餘的引數會在呼叫成功後全部傳遞給__init__方法初始化,這一下子就看出了誰是老子誰是小子的關係。

所以,__new__方法(第乙個執行)先於__init__方法執行:

class a:

pass

class b(a):

def __new__(cls):

print("__new__方法被執行")

return super().__new__(cls)

def __init__(self):

print("__init__方法被執行")

b = b()

---------------------------------------

執行結果為:

__new__方法被執行

__init__方法被執行

​ 我們比較兩個方法的引數,可以發現__new__方法是傳入類(cls),而__init__方法傳入類的例項化物件(self),而有意思的是,__new__方法返回的值就是乙個例項化物件(ps:如果__new__方法返回none,則__init__方法不會被執行,並且返回值只能呼叫父類中的__new__方法,而不能呼叫毫無關係的類的__new__方法)。我們可以這麼理解它們之間的關係,__new__是開闢疆域的大將軍,而__init__是在這片疆域上辛勤勞作的小老百姓,只有__new__執行完後,開闢好疆域後,__init__才能工作。

絕大多數情況下,我們都不需要自己重寫__new__方法,但在當繼承乙個不可變的型別(例如str類,int類等)時,它的特性就尤顯重要了。我們舉下面這個例子:

class capstr(str):

def __init__(self,string):

string = string.upper()

a = capstr("i love china!")

print(a)

------------------------------

執行結果為:

i love china!

class capstr(str):

def __new__(cls,string):

string = string.upper()

return super().__new__(cls,string)

a = capstr("i love china!")

print(a)

--------------------------------------------

執行結果為:

i love china!

​ 我們可以根據上面的理論可以這樣分析,我們知道字串是不可改變的,所以第乙個例子中,傳入的字串相當於已經被打下的疆域,而這塊疆域除了將軍其他誰也無法改變,__init__只能在這塊領地上乾瞪眼,此時這塊疆域就是」i love china!「。而第二個例子中,__new__大將軍重新去開闢了一塊疆域,所以疆域上的內容也發生了變化,此時這塊疆域變成了」i love china!「。

__new__和__init__想配合才是python中真正的類構造器。

svm通俗講解 SVM通俗講解

svm support vector machine 支援向量機相關理論介紹 基於資料的機器學習是現代智慧型技術中的重要方面,研究從觀測資料 樣本 出發尋找規律,利用這些規律對未來資料或無法觀測的資料進行 迄今為止,關於機器學習還沒有一種被共同接受的理論框架,關於其實現方法 大致可以分為 三種 3 ...

epoll通俗講解

首先我們來定義流的概念,乙個流可以是檔案,socket,pipe等等可以進行i o操作的核心物件。不管是檔案,還是套接字,還是管道,我們都可以把他們看作流。之後我們來討論i o的操作,通過read,我們可以從流中讀入資料 通過write,我們可以往流寫入資料。現在假定乙個情形,我們需要從流中讀資料,...

池化通俗講解

在通過卷積獲得了特徵 features 之後,下一步我們希望利用這些特徵去做分類。理論上講,人們可以用所有提取得到的特徵去訓練分類器,例如 softmax 分類器,但這樣做面臨計算量的挑戰。例如 對於乙個 96x96 畫素的影象,假設我們已經學習得到了400個定義在8x8輸入上的特徵,每乙個特徵和影...