前言
本文主要給大家介紹關于python中__init__、__new__和__call__方法的相關內容,分享出來供大家參考學習,下面話不多說,來一起看看詳細的介紹:
任何事物都有一個從創建,被使用,再到消亡的過程,在程序語言面向對象編程模型中,對象也有相似的命運:創建、初始化、使用、垃圾回收,不同的階段由不同的方法(角色)負責執行。
定義一個類時,大家用得最多的就是 __init__ 方法,而 __new__ 和 __call__ 使用得比較少,這篇文章試圖幫助大家把這3個方法的正確使用方式和應用場景分別解釋一下。
關于 Python 新式類和老式類在這篇文章不做過多討論,因為老式類是 Python2 中的概念,現在基本沒人再會去用老式類,新式類必須顯示地繼承 object,而 Python3 中,只有新式類,默認繼承了 object,無需顯示指定,本文代碼都是基于 Python3 來討論。
__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__
從輸出結果來看, __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) {}            
新聞熱點
疑難解答