国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

淺談python中的__init__、__new__和__call__方法

2020-02-16 01:54:50
字體:
來源:轉載
供稿:網友

前言

本文主要給大家介紹關于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) {}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 扶风县| 漯河市| 梓潼县| 共和县| 韶关市| 子长县| 苏州市| 大姚县| 松阳县| 普格县| 文水县| 沁水县| 禹州市| 鹤山市| 陇西县| 新昌县| 阿克苏市| 通化市| 沙坪坝区| 武冈市| 永泰县| 沁阳市| 台中县| 始兴县| 和田县| 庄河市| 巧家县| 侯马市| 蒙城县| 涿鹿县| 交口县| 丰镇市| 惠来县| 滁州市| 湘阴县| 沐川县| 潜江市| 大邑县| 个旧市| 道真| 富宁县|