天天看點

第8.4節 Python類中不是構造方法卻勝似構造方法的__new方法__深入剖析:文法釋義

一、    引言

在本博前面的内容都對構造方法__init__進行了介紹,也在前面章節引入了__new__方法,但老猿認為__new__方法比構造方法__init__更應該屬于構造方法。這是因為在Python中,__new__方法是在執行個體對象建立時執行的,而構造方法__init__是執行個體建立後執行的。

二、    __new__方法介紹

__new__方法是Python新式類引入的,__new__通常用于控制生成一個新執行個體的過程。它是類級别的靜态方法,是在建立執行個體對象前執行,如果自定義類中沒有重寫該方法,則Python自動調用父類的方法,當所有父類也沒有重寫定義該方法時,則直接調用object類的__new__方法。重寫時,相關方法的文法如下:

1.    文法:

__new__(cls,*args,**kwargs)

其中:

4)    cls為建立執行個體對應類的類名,由Python自動傳入;

5)    args為執行個體建立時傳入的非關鍵字參數,打包成元組tuple給函數體調用;

6)    kwargs為執行個體建立時傳入的關鍵字參數,形式為字典,鍵值為關鍵字參數的關鍵字,字典元素值為對應關鍵字參數的實參值。

2.    文法釋義:

1)    __new__(cls,*args,**kwargs)的參數是與執行個體定義的參數相對應的,執行個體定義的文法如下:

執行個體=類名(*args,**kwargs)

則:

d)    __new__的=方法中的cls一般為執行個體定義時的“類名”對應類,表示要建立一個該“類名”對應類型的執行個體,但在某些特殊情況下,可以改成其他類,如果類改成了其他類,則建立的執行個體就是什麼類的類型。這種場景在某些時候特别有用,本節後面再介紹;

e)    後面兩個參數args、kwargs是完全複制執行個體定義中的兩種參數,表示執行個體定義傳入什麼參數,則__new__方法是在執行個體定義參數的基礎上增加一個“類cls”的參數,并将cls作為第一個參數。

f)    args、kwargs不是兩個參數,是兩種參數,其中kwargs是關鍵字參數,args是非關鍵字參數,用args、kwargs分别傳遞建立執行個體時傳遞的所有正常實參和關鍵字參數實參,是以可能是0個或多個真正的參數。*args、**kwargs這種形式的參數傳遞模式稱為“參數收集”,具體内容請參見本部落格的《第5.2節 Python的函數參數收集》内容;

2)    以上文法是自定義類重寫__new__方法時必須遵守的文法,當Python準備建立執行個體時自動調用該方法,如果自定義類沒有重寫該方法,則Python預設調用該類的直接父類的__new__()方法來構造該類的執行個體。如果該類的父類也沒有重寫__new__(),那麼将一直按此規矩追溯至object的__new__()方法。

Python中的__new__方法非常神奇,是類執行個體化時的最關鍵方法,比構造方法__init__還重要,本節介紹了__new__的文法及各個參數的含義,實際上隻介紹了基本的文法知識。請大家好好了解,鑒于該方法太重要,涉及内容比較多,後面幾節将進一步深入剖析這個神奇的方法。