首頁  >  文章  >  後端開發  >  Python 面試高頻問題:__Init__ 和__New__的區別

Python 面試高頻問題:__Init__ 和__New__的區別

PHPz
PHPz轉載
2023-04-12 14:31:061466瀏覽

Python 面試高頻問題:__Init__ 和__New__的區別

在Python類別內部定義,以_ _ xx _ _ 結尾的方法,都是類別的內建方法,也稱為魔法方法。

類別的內建方法,會在某種條件滿足下自動觸發,這裡我們重點講解一下__init__和__new__,他們與實例創建有關。

簡述__init__

__init__(self): 這個方法我們相對較熟悉,他是python 類別中預設的初始化方法,即當一個類別實例化時,就會執行的方法。

詳解__new__

__new__ 方法重寫非常固定,通常如下:

def __new__(cls):
return super().__new__(cls)

其中cls 代表類別本身。

重寫__new__方法的程式碼非常固定:重寫__new__方法一定要return super().__new__(cls),或者return object.__new__(cls)否則python解釋器會得不到分配了空間的物件引用,就不會呼叫物件的初始化方法。例如:

class Mycls:
def __new__(cls):
 print('new')
 return super().__new__(cls)
def __init__(self):
print('init')
my=Mycls()

輸出:

  • new
  • init

我們可以看到new 在init之前輸出,證明__new__ (cls)在__init__(self)之前執行。

我們重寫程式碼:

def __new__(cls):
 print('new')
my=Mycls()
print(my)

輸出:

  • new
  • None

可以看到如果__new__(cls):中沒有傳回值,不會傳回實例,__init__(self)將不會執行。

__new__和__init__總結

1.__new__()方法用於建立實例,類別實例化之前會先調用,它是class的方法,是個靜態方法。而__init__()方法使用者初始化實例,該方法用在實例物件建立後被調用,它是實例物件的方法,用於設定類別實例物件的一些初始值。

2.如果類別中同時出現了__init__()方法和__new__()方法,則先呼叫__new__()方法後呼叫__init__()方法。 __new__()方法是建立實例的第一步,執行完了需要傳回已建立的類別的實例,否則則報錯,無法執行__init__()方法。其中,__init__()方法將不傳回任何資訊。

__new__的應用

有的同學會問 用__new__來實現什麼東東呢?

個人覺得,單例就是一個最經典的應用。單例模式(Singleton Pattern)是常用的軟體設計模式,此模式的主要目的是確保某一個類別只有一個實例存在。當我們希望在整個系統中,某個類別只能出現一個實例時,單例物件就能派上用場。例如,一個系統中可以存在多個列印任務,但是只能有一個正在工作的任務;一個系統只能有一個視窗管理器或檔案系統;一個系統只能有一個計時工具或ID(序號)產生器。

具體實作程式碼如下:

class Mycls:
_instance = None
 def __new__(cls):
 # 判断该类的属性是否为空;对第一个对象没有被创建,我们应该调用父类的方法,为第一个对象分配空间
 if cls._instance == None:
 # 把类属性中保存的对象引用返回给python的解释器
cls._instance = object.__new__(cls)
return cls._instance
# 如果cls._instance不为None,直接返回已经实例化了的实例对象
else:
return cls._instance
def __init__(self):
print('init')
my1=Mycls()
print(my1)
my2=Mycls()
print(my2)

輸出:

init
<__main__.Mycls object at 0x000000406E471148>
Init
<__main__.Mycls object at 0x000000406E471148>

可以看到雖然叫my1 和my2,但是他們都是物件0x000000406E471148,這就是單例模式的應用。

以上是Python 面試高頻問題:__Init__ 和__New__的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除